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); }
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öntem | Dönüş türü | Kısa açıklama |
|---|---|---|
has | Boolean | Kilit alındıysa true değerini döndürür. |
release | void | Kilidi serbest bırakır ve kilidi bekleyen diğer işlemlerin devam etmesine izin verir. |
try | Boolean | Kilit edinmeye çalışır ve belirtilen milisaniye sayısı sonunda zaman aşımına uğrar. |
wait | void | Kilit 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
| Ad | Tür | Açıklama |
|---|---|---|
timeout | Integer | Kilidi 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
| Ad | Tür | Açıklama |
|---|---|---|
timeout | Integer | Kilidi 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