Class Lock

Zablokuj

Reprezentacja blokady wzajemnego wykluczania.

Ta klasa umożliwia skryptom upewnienie się, że w danym momencie tylko jedna instancja skryptu wykonuje daną sekcję kodu. Jest to szczególnie przydatne w przypadku wywołań zwrotnych i wyzwalaczy, gdy działanie użytkownika może spowodować zmiany w zasobie udostępnionym i chcesz mieć pewność, że nie dojdzie do kolizji.

Przykład poniżej pokazuje, jak użyć blokady w procedurze obsługi przesyłania 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);
}
Bez usługi blokowania, jeśli 2 użytkowników prześle formularz w przybliżeniu w tym samym czasie, numery zgłoszeń 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ść true, jeśli blokada została uzyskana.
releaseLock()voidZwalnia blokadę, umożliwiając kontynuowanie innym procesom oczekującym na blokadę.
tryLock(timeoutInMillis)BooleanPróbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu.
waitLock(timeoutInMillis)voidPróbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu i zgłasza wyjątek.

Szczegółowa dokumentacja

hasLock()

Zwraca wartość true, jeśli blokada została uzyskana. Ta metoda zwraca wartość false, jeśli metody tryLock(timeoutInMillis) lub waitLock(timeoutInMillis) nie zostały nigdy wywołane, upłynął limit czasu przed pobraniem blokady lub wywołano metodę releaseLock().

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

Powrót

Boolean – true, jeśli blokada została uzyskana, a w przeciwnym razie – false.


releaseLock()

Zwalnia blokadę, umożliwiając kontynuowanie innym procesom oczekującym na blokadę. Blokada jest zwalniana automatycznie po zakończeniu skryptu, ale dla większej wydajności najlepiej jest ją zwalniać, gdy nie potrzebujesz już wyłącznego dostępu do fragmentu kodu. Ta metoda nie wywołuje żadnego efektu, jeśli blokada nie została uzyskana.

Pamiętaj, że jeśli pracujesz z arkuszem kalkulacyjnym, przed zwolnieniem blokady musisz wywołać funkcję SpreadsheetApp.flush(), aby zatwierdzić wszystkie oczekujące zmiany w arkuszu, gdy 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ę, a po upływie podanej liczby milisekund przekracza limit czasu. Ta metoda nie ma wpływu, 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 uzyskanie blokady w milisekundach.

Powrót

Boolean – true, jeśli blokada została uzyskana, a w przeciwnym razie – false.


waitLock(timeoutInMillis)

Próbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu i zgłasza wyjątek. Ta metoda jest taka sama jak tryLock(timeoutInMillis), z tą różnicą, że zamiast zwracać wartość false, zgłasza wyjątek, gdy nie można 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 uzyskanie blokady w milisekundach.

Rzuty

Error – jeśli metoda przekroczyła limit czasu, zanim udało się uzyskać blokadę.