Darstellung einer Sperre mit gegenseitiger Ausschließung.
Mit dieser Klasse können Scripts dafür sorgen, dass immer nur eine Instanz des Scripts einen bestimmten Codeabschnitt ausführt. Das ist besonders nützlich für Rückrufe und Trigger, bei denen eine Nutzeraktion Änderungen an einer freigegebenen Ressource verursachen kann und Sie dafür sorgen möchten, dass es keine Kollisionen gibt.
Im folgenden Beispiel wird gezeigt, wie eine Sperre in einem Formular-Sende-Handler verwendet wird.
// 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); }
last Ticket Number
ändern könnte, nachdem sie aus der Script Properties
gelesen wurde, aber bevor der neue Wert zurückgeschrieben wurde.Methoden
Methode | Rückgabetyp | Kurzbeschreibung |
---|---|---|
has | Boolean | Gibt „true“ zurück, wenn die Sperre erworben wurde. |
release | void | Die Sperre wird aufgehoben, sodass andere Prozesse, die auf die Sperre gewartet haben, fortgesetzt werden können. |
try | Boolean | Es wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt ein Zeitüberschreitungsfehler auf. |
wait | void | Es wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt eine Zeitüberschreitung mit einer Ausnahme auf. |
Detaillierte Dokumentation
has Lock()
Gibt „true“ zurück, wenn die Sperre erworben wurde. Diese Methode gibt „false“ zurück, wenn try
oder wait
nie aufgerufen wurden, die Zeitüberschreitung eingetreten ist, bevor die Sperre abgerufen werden konnte, oder release
aufgerufen wurde.
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Rückflug
Boolean
– „true“, wenn die Sperre erworben wurde, andernfalls „false“
release Lock()
Die Sperre wird aufgehoben, sodass andere Prozesse, die auf die Sperre gewartet haben, fortgesetzt werden können. Die Sperre wird automatisch aufgehoben, wenn das Script beendet wird. Aus Effizienzgründen sollten Sie sie jedoch aufheben, sobald Sie keinen exklusiven Zugriff mehr auf einen Codeabschnitt benötigen. Diese Methode hat keine Auswirkungen, wenn die Sperre nicht erworben wurde.
Wenn Sie mit einer Tabelle arbeiten, sollten Sie vor dem Lösen der Sperre SpreadsheetApp.flush() aufrufen, um alle ausstehenden Änderungen an der Tabelle zu übernehmen, solange Sie noch exklusiven Zugriff darauf haben.
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
Es wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt ein Zeitüberschreitungsfehler auf. Diese Methode hat keine Auswirkungen, wenn die Sperre bereits erworben wurde.
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parameter
Name | Typ | Beschreibung |
---|---|---|
timeout | Integer | wie lange in Millisekunden gewartet werden soll, bis die Sperre übernommen wird |
Rückflug
Boolean
– „true“, wenn die Sperre erworben wurde, andernfalls „false“
wait Lock(timeoutInMillis)
Es wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt eine Zeitüberschreitung mit einer Ausnahme auf. Diese Methode ist mit try
identisch, mit der Ausnahme, dass eine Ausnahme geworfen wird, wenn die Sperre nicht erworben werden konnte, anstatt „false“ zurückzugeben.
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parameter
Name | Typ | Beschreibung |
---|---|---|
timeout | Integer | wie lange in Millisekunden gewartet werden soll, bis die Sperre übernommen wird |
Löst
Error
– wenn die Methode ein Zeitlimit überschritten hat, bevor die Sperre erworben wurde