Class Lock

Kilitle

Bir birbirini dışlama kilidinin temsili.

Bu sınıf, komut dosyalarının belirli bir kod bölümünü tek seferde yalnızca bir örneğinin yürütmesini sağlar. Bu özellik, özellikle kullanıcı işleminin paylaşılan bir kaynakta değişikliklere neden olabileceği ve çakışma olmaması gerektiği durumlarda geri çağırma ve tetikleyiciler için yararlıdır.

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);
}
Kilitleme hizmeti olmadan, iki kullanıcı formu yaklaşık olarak aynı anda gönderirse lastTicketNumber mülkü ScriptProperties'den okunduktan sonra ancak yeni değer geri yazılmadan önce değişebileceğinden, destek kaydı numaraları aynı olabilir.

Yöntemler

YöntemDönüş türüKısa açıklama
hasLock()BooleanKilit edinildiyse true değerini döndürür.
releaseLock()voidKilidi serbest bırakarak kilit için bekleyen diğer işlemlerin devam etmesine olanak tanır.
tryLock(timeoutInMillis)BooleanKilidi edinmeye çalışır ve belirtilen milisaniye sayısından sonra zaman aşımı olur.
waitLock(timeoutInMillis)voidKilidi elde etmeye çalışır ve belirtilen milisaniye sayısından sonra bir istisnayla zaman aşımına uğrar.

Ayrıntılı dokümanlar

hasLock()

Kilit edinildiyse true değerini döndürür. tryLock(timeoutInMillis) veya waitLock(timeoutInMillis) hiç çağrılmadıysa, kilit alınamadan zaman aşımı oluştuysa ya da releaseLock() çağrıldıysa bu yöntem yanlış 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 edinildiyse doğru, aksi takdirde yanlış değerini alır.


releaseLock()

Kilidi serbest bırakarak kilit için bekleyen diğer işlemlerin devam etmesine olanak tanır. Komut dosyası sona erdiğinde kilit otomatik olarak açılır ancak verimlilik açısından, bir kod bölümüne özel erişime ihtiyacınız kalmadıkça kilidi hemen açmanız önerilir. Kilit edinilmediyse bu yöntemin hiçbir etkisi olmaz.

Bir e-tabloyla çalışıyorsanız kilidi bırakmadan önce SpreadsheetApp.flush() işlevini çağırarak e-tabloya hâlâ münhasır erişiminiz varken bekleyen tüm değişiklikleri kaydetmeniz gerektiğini unutmayın.

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

tryLock(timeoutInMillis)

Kilidi edinmeye çalışır ve belirtilen milisaniye sayısından sonra zaman aşımı olur. Kilit zaten edinilmişse bu yöntemin 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 almak için beklenecek süre (milisaniye cinsinden)

Return

Boolean: Kilit edinildiyse doğru, aksi takdirde yanlış değerini alır.


waitLock(timeoutInMillis)

Kilidi elde etmeye çalışır ve belirtilen milisaniye sayısından sonra bir istisnayla zaman aşımına uğrar. Bu yöntem, kilit alınamadığında false döndürmek yerine istisna atması dışında tryLock(timeoutInMillis) ile aynı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 almak için beklenecek süre (milisaniye cinsinden)

Atışlar

Error: Kilit elde edilmeden önce yöntemin zaman aşımı yaşanırsa