Class Lock

Kilitle

Karşılıklı dışlama kilidinin temsili.

Bu sınıf, komut dosyalarının belirli bir kod bölümünün tek seferde yalnızca bir örneğinin yürütülmesini sağlamasına olanak tanır. Bu özellik, özellikle geri aramalar ve tetikleyiciler için yararlıdır. Bu durumlarda, kullanıcı işlemi paylaşılan bir kaynakta değişikliklere neden olabilir ve çakışma olmamasını sağlamak istersiniz.

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

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

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

  const scriptProperties = PropertiesService.getScriptProperties();

  const ticketNumber =
      Number(scriptProperties.getProperty('lastTicketNumber')) + 1;
  scriptProperties.setProperty('lastTicketNumber', ticketNumber);

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

  targetCell.setValue(ticketNumber);
}
Kilit hizmeti olmadan, iki kullanıcı formu yaklaşık olarak aynı anda gönderirse lastTicketNumber özelliği ScriptProperties özelliğinden okunduktan sonra ancak yeni değer geri yazılmadan önce değişebileceğinden kayıt numaraları aynı olabilir.

Yöntemler

YöntemDönüş türüKısa açıklama
hasLock()BooleanKilit alındıysa true değerini döndürür.
releaseLock()voidKilidi serbest bırakır ve kilidi bekleyen diğer işlemlerin devam etmesine izin verir.
tryLock(timeoutInMillis)BooleanKilit edinmeye çalışır ve belirtilen milisaniye sayısı sonunda zaman aşımına uğrar.
waitLock(timeoutInMillis)voidKilit edinmeye çalışır ve belirtilen milisaniye sayısı geçtikten sonra bir istisnayla zaman aşımına uğrar.

Ayrıntılı belgeler

hasLock()

Kilit alındıysa true değerini döndürür. Bu yöntem, tryLock(timeoutInMillis) veya waitLock(timeoutInMillis) hiç çağrılmamışsa, kilit alınamadan önce zaman aşımına uğramışsa ya da releaseLock() çağrılmışsa false değerini döndürür.

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

Return

Boolean: Kilit edinilmişse true, aksi takdirde false.


releaseLock()

Kilidi serbest bırakır ve kilidi bekleyen diğer işlemlerin devam etmesine izin verir. Komut dosyası sonlandırıldığında kilit otomatik olarak serbest bırakılır ancak verimlilik için kodun bir bölümüne özel erişime ihtiyacınız kalmadığı anda kilidi serbest bırakmanız en iyisidir. Kilit alınmamışsa bu yöntemin etkisi olmaz.

Bir e-tabloyla çalışıyorsanız kilidi serbest bırakmadan önce SpreadsheetApp.flush() işlevini çağırarak e-tabloda bekleyen tüm değişiklikleri, e-tabloya özel erişiminiz devam ederken uygulamanız gerektiğini unutmayın.

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

tryLock(timeoutInMillis)

Kilit edinmeye çalışır ve belirtilen milisaniye sayısı sonunda zaman aşımına uğrar. Bu yöntemin, kilit zaten alınmışsa hiçbir etkisi olmaz.

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

Parametreler

AdTürAçıklama
timeoutInMillisIntegerKilidi edinmek için beklenecek süre (milisaniye cinsinden).

Return

Boolean: Kilit edinilmişse true, aksi takdirde false.


waitLock(timeoutInMillis)

Kilit edinmeye çalışır ve belirtilen milisaniye sayısı geçtikten sonra bir istisnayla zaman aşımına uğrar. Bu yöntem, tryLock(timeoutInMillis) ile aynıdır. Tek fark, false döndürmek yerine kilit alınamadığında istisna oluşturmasıdır.

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

Parametreler

AdTürAçıklama
timeoutInMillisIntegerKilidi edinmek için beklenecek süre (milisaniye cinsinden).

Verdiği hatalar

Error: Yöntem, kilit alınmadan önce zaman aşımına uğradıysa