Class Lock

Zablokuj

Ilustracja blokady wzajemnego wykluczenia.

Ta klasa umożliwia skryptom zapewnienie, że dany fragment kodu jest wykonywany tylko przez jedną instancję skryptu naraz. Jest to szczególnie przydatne w przypadku wywołań zwrotnych i wyzwalaczy, gdy działanie użytkownika może spowodować zmiany w wspólnym zasobie, a chcesz mieć pewność, że nie dojdzie do kolizji.

Ten przykład pokazuje, jak użyć blokady w obiekcie obsługującym przesłanie formularza.

// 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);
}
Jeśli bez usługi blokowania 2 użytkownicy prześlą formularz mniej więcej w tym samym czasie, numery biletów mogą być takie same, ponieważ właściwość lastTicketNumber może się zmienić po odczytaniu z ScriptProperties, ale przed zapisaniem nowej wartości.

Metody

MetodaZwracany typKrótki opis
hasLock()BooleanZwraca wartość „prawda”, jeśli udało się uzyskać blokadę.
releaseLock()voidZwalnia blokadę, umożliwiając kontynuowanie innych procesów oczekujących na blokadę.
tryLock(timeoutInMillis)BooleanPróbuje uzyskać blokadę, która wygasa po określonym czasie w milisekundach.
waitLock(timeoutInMillis)voidPróbuje uzyskać blokadę, wygaszając po określonym czasie z wyjątkiem.

Szczegółowa dokumentacja

hasLock()

Zwraca wartość „prawda”, jeśli udało się uzyskać blokadę. Ta metoda zwróci wartość false, jeśli metody tryLock(timeoutInMillis) lub waitLock(timeoutInMillis) nie zostały nigdy wywołane, jeśli czas oczekiwania na zablokowanie wygasł, zanim udało się go pobrać, lub jeśli została wywołana metoda releaseLock().

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

Powrót

Boolean – wartość true (prawda), jeśli udało się uzyskać blokadę, w przeciwnym razie wartość false (fałsz).


releaseLock()

Zwalnia blokadę, umożliwiając kontynuowanie innych procesów oczekujących na blokadę. Blokada jest automatycznie odblokowywana po zakończeniu skryptu, ale dla zwiększenia wydajności najlepiej odblokować ją, gdy nie potrzebujesz już wyłącznego dostępu do sekcji kodu. Ta metoda nie działa, jeśli blokada nie została uzyskana.

Jeśli pracujesz z arkuszem kalkulacyjnym, przed odblokowaniem go wywołaj metodę SpreadsheetApp.flush(), aby zatwierdzić wszystkie oczekujące zmiany w arkuszu, dopóki nadal masz do niego wyłączny dostęp.

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

tryLock(timeoutInMillis)

Próbuje uzyskać blokadę, która wygasa po określonym czasie w milisekundach. Ta metoda nie działa, jeśli blokada została już uzyskana.

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

Parametry

NazwaTypOpis
timeoutInMillisIntegerczas oczekiwania na nałożenie blokady (w milisekundach).

Powrót

Boolean – wartość true (prawda), jeśli udało się uzyskać blokadę, w przeciwnym razie wartość false (fałsz).


waitLock(timeoutInMillis)

Próbuje uzyskać blokadę, wygaszając po upływie podanej liczby milisekund. Ta metoda jest taka sama jak tryLock(timeoutInMillis), z tym wyjątkiem, że zamiast zwracać wartość false, zwraca wyjątek, gdy nie udało się uzyskać blokady.

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

Parametry

NazwaTypOpis
timeoutInMillisIntegerczas oczekiwania na nałożenie blokady (w milisekundach).

Rzuty

Error – jeśli metoda została przerwana przed uzyskaniem blokady;