Class Lock

Kilitle

Karşılıklı hariç tutma kilidinin temsili.

Bu sınıf, komut dosyalarının belirli bir kod bölümünü aynı anda yalnızca bir komut dosyası çalıştırdığından emin olmasını sağlar. Bu, özellikle bir kullanıcı işleminin paylaşılan bir kaynakta değişikliklere neden olabileceği ve çakışma olmadığından emin olmak istediğiniz geri çağırmalar ve tetikleyiciler için kullanışlıdır.

Aşağıdaki örnekte form gönderme işleyicide nasıl kilidin kullanılacağı gösterilmektedir.

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Gets a script lock before modifying a shared resource.
  var lock = LockService.getScriptLock();
  // Waits for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Releases the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
Kilitleme hizmeti kullanılmadığında, formu yaklaşık olarak aynı anda iki kullanıcı gönderirse bilet numaraları aynı olabilir. Çünkü lastTicketNumber özelliği, ScriptProperties öğesinden okunduktan sonra, yeni değer geri yazılmadan önce değişebiliyordu.

Yöntemler

YöntemDönüş türüKısa açıklama
hasLock()BooleanKilit edinildiyse true değerini döndürür.
releaseLock()voidKilidi açarak, kilidi bekleyen diğer işlemlerin devam etmesini sağlar.
tryLock(timeoutInMillis)BooleanKilidi alma girişimleri, sağlanan milisaniye sayısından sonra zaman aşımına uğrar.
waitLock(timeoutInMillis)voidKilit edinme girişimleri. Sağlanan milisaniye sayısından sonra bir istisnayla zaman aşımına uğrar.

Ayrıntılı belgeler

hasLock()

Kilit edinildiyse true değerini döndürür. tryLock(timeoutInMillis) veya waitLock(timeoutInMillis) hiç çağrılmadıysa, kilit alınmadan önce zaman aşımına uğradıysa veya releaseLock() çağrıldıysa bu yöntem false değerini döndürür.

var lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Return

Boolean: Kilit edinilmişse doğru, aksi takdirde yanlış


releaseLock()

Kilidi açarak, kilidi bekleyen diğer işlemlerin devam etmesini sağlar. Komut dosyası sona erdiğinde kilit otomatik olarak serbest bırakılır ancak verimlilik için bir kod bölümüne özel erişime artık ihtiyaç duymadığınız anda kilidi açmanız önerilir. Kilit elde edilmezse bu yöntemin herhangi bir etkisi olmaz.

Bir e-tablo üzerinde çalışıyorsanız kilidi kaldırmadan önce, e-tabloya özel erişim hakkınız varken bekleyen tüm değişiklikleri uygulamak için SpreadsheetApp.flush() işlevini çağırmanız gerektiğini unutmayın.

var lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

Kilidi alma girişimleri, sağlanan milisaniye sayısından sonra zaman aşımına uğrar. Kilit halihazırda alınmışsa bu yöntemin herhangi bir etkisi yoktur.

var lock = LockService.getScriptLock();
var success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Parametreler

AdTürAçıklama
timeoutInMillisIntegerkilidi almak için beklenecek süre (milisaniye)

Return

Boolean: Kilit edinilmişse doğru, aksi takdirde yanlış


waitLock(timeoutInMillis)

Kilit edinme girişimleri. Sağlanan milisaniye sayısından sonra bir istisnayla zaman aşımına uğrar. Bu yöntem, tryLock(timeoutInMillis) ile aynıdır. Tek fark, kilit yanlış değerini döndürmek yerine kilidin alınamadığı durumlarda istisna gönderir.

var lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Parametreler

AdTürAçıklama
timeoutInMillisIntegerkilidi almak için beklenecek süre (milisaniye)

Dekoratif yastıklar

Error - kilit edinilmeden önce yöntem zaman aşımına uğradıysa