Class Lock

Sperren

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);
}
Ohne den Sperrdienst könnten zwei Nutzer, die das Formular ungefähr gleichzeitig einreichen, dieselbe Ticketnummer erhalten, da sich die Property lastTicketNumber ändern könnte, nachdem sie aus der ScriptProperties gelesen wurde, aber bevor der neue Wert zurückgeschrieben wurde.

Methoden

MethodeRückgabetypKurzbeschreibung
hasLock()BooleanGibt „true“ zurück, wenn die Sperre erworben wurde.
releaseLock()voidDie Sperre wird aufgehoben, sodass andere Prozesse, die auf die Sperre gewartet haben, fortgesetzt werden können.
tryLock(timeoutInMillis)BooleanEs wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt ein Zeitüberschreitungsfehler auf.
waitLock(timeoutInMillis)voidEs wird versucht, die Sperre zu erwerben. Nach der angegebenen Anzahl von Millisekunden tritt eine Zeitüberschreitung mit einer Ausnahme auf.

Detaillierte Dokumentation

hasLock()

Gibt „true“ zurück, wenn die Sperre erworben wurde. Diese Methode gibt „false“ zurück, wenn tryLock(timeoutInMillis) oder waitLock(timeoutInMillis) nie aufgerufen wurden, die Zeitüberschreitung eingetreten ist, bevor die Sperre abgerufen werden konnte, oder releaseLock() 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“


releaseLock()

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();

tryLock(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

NameTypBeschreibung
timeoutInMillisIntegerwie lange in Millisekunden gewartet werden soll, bis die Sperre übernommen wird

Rückflug

Boolean – „true“, wenn die Sperre erworben wurde, andernfalls „false“


waitLock(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 tryLock(timeoutInMillis) 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

NameTypBeschreibung
timeoutInMillisIntegerwie 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