Class Lock

Sperren

Darstellung einer Sperre zum gegenseitigen Ausschluss.

Mit dieser Klasse können Skripts sicherstellen, dass jeweils nur eine Instanz des Skripts einen bestimmten Codeabschnitt ausführt. Dies ist besonders nützlich für Callbacks und Trigger, bei denen eine Nutzeraktion zu Änderungen an einer freigegebenen Ressource führen kann und Sie sicherstellen möchten, dass es keine Konflikte gibt.

Das folgende Beispiel zeigt, wie eine Sperre in einem Handler für Formularübermittlungen verwendet wird.

// 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);
}
Ohne den Sperrdienst können die Ticketnummern identisch sein, wenn zwei Nutzer das Formular ungefähr gleichzeitig senden. Das liegt daran, dass sich das Attribut lastTicketNumber ändern kann, nachdem es aus ScriptProperties gelesen wurde, aber bevor der neue Wert zurückgeschrieben wurde.

Methoden

MethodeRückgabetypKurzbeschreibung
hasLock()BooleanGibt "true" zurück, wenn die Sperre übernommen wurde.
releaseLock()voidGibt die Sperre frei, sodass andere Prozesse, die auf die Sperre warten, fortgesetzt werden können.
tryLock(timeoutInMillis)BooleanVersucht, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt.
waitLock(timeoutInMillis)voidVersucht, die Sperre abzurufen, wobei mit einer Ausnahme nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt.

Detaillierte Dokumentation

hasLock()

Gibt "true" zurück, wenn die Sperre übernommen wurde. Diese Methode gibt „false“ zurück, wenn tryLock(timeoutInMillis) oder waitLock(timeoutInMillis) nie aufgerufen wurden, das Zeitlimit vor dem Abrufen der Sperre überschritten wurde oder releaseLock() aufgerufen wurde.

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

Return

Boolean: „true“, wenn die Sperre aktiviert wurde, andernfalls „false“


releaseLock()

Gibt die Sperre frei, sodass andere Prozesse, die auf die Sperre warten, fortgesetzt werden können. Die Sperre wird automatisch aufgehoben, wenn das Skript beendet wird. Aus Effizienzgründen ist es jedoch am besten, sie freizugeben, sobald Sie keinen exklusiven Zugriff auf einen Codeabschnitt mehr benötigen. Diese Methode hat keine Auswirkungen, wenn die Sperre nicht übernommen wurde.

Wenn Sie mit einer Tabelle arbeiten, sollten Sie vor dem Aufheben der Sperre SpreadsheetApp.flush() aufrufen, um alle ausstehenden Änderungen an der Tabelle zu übernehmen, während Sie weiterhin exklusiven Zugriff darauf haben.

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

tryLock(timeoutInMillis)

Versucht, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt. Diese Methode hat keine Auswirkungen, wenn die Sperre bereits übernommen wurde.

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

Parameter

NameTypBeschreibung
timeoutInMillisIntegerWartezeit bis zum Anfordern der Sperre (in Millisekunden)

Return

Boolean: „true“, wenn die Sperre aktiviert wurde, andernfalls „false“


waitLock(timeoutInMillis)

Versucht, die Sperre abzurufen, wobei mit einer Ausnahme nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt. Diese Methode ist die gleiche wie tryLock(timeoutInMillis), mit der Ausnahme, dass sie eine Ausnahme auslöst, wenn die Sperre nicht übernommen werden konnte, anstatt „false“ zurückzugeben.

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

Parameter

NameTypBeschreibung
timeoutInMillisIntegerWartezeit bis zum Anfordern der Sperre (in Millisekunden)

Löst aus

Error: Wenn es zu einer Zeitüberschreitung bei der Methode kommt, bevor die Sperre abgerufen wurde