Class Lock

Zablokuj

Symbol blokady wzajemnej wykluczania.

Ta klasa pozwala skryptom zadbać o to, aby tylko jedno wystąpienie skryptu wykonywało daną sekcję kodu w danym momencie. Jest to szczególnie przydatne w przypadku wywołań zwrotnych i aktywatorów, gdy działanie użytkownika może spowodować zmiany w udostępnionym zasobie i chcesz zapobiec kolizji.

Z przykładu poniżej dowiesz się, jak używać blokady w module obsługi przesyłania formularza.

// 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);
}
W przypadku braku usługi blokady, jeśli 2 użytkowników prześle formularz mniej więcej w tym samym czasie, numery zgłoszeń mogą się okazać takie same, ponieważ właściwość lastTicketNumber mogła ulec zmianie po odczytaniu z ScriptProperties, ale przed odpisaniem nowej wartości.

Metody

MetodaZwracany typKrótki opis
hasLock()BooleanZwraca wartość „true” (prawda), jeśli blokada została nałożona.
releaseLock()voidZwalnia blokadę, aby inne procesy mogły kontynuować oczekiwanie na blokadę.
tryLock(timeoutInMillis)BooleanPodejmuje próby włączenia blokady. Limit czasu zostaje przekroczony po podanej liczbie milisekund.
waitLock(timeoutInMillis)voidPodejmuje próby włączenia blokady, przekroczenie limitu czasu z wyjątkiem po określonej liczbie milisekund.

Szczegółowa dokumentacja

hasLock()

Zwraca wartość „true” (prawda), jeśli blokada została nałożona. Ta metoda zwraca wartość false, jeśli metoda tryLock(timeoutInMillis) lub waitLock(timeoutInMillis) nie została wywołana, przed pobraniem blokady upłynął limit czasu lub jeśli została wywołana właściwość releaseLock().

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

Powroty

Boolean – ma wartość prawda, jeśli blokada została nałożona, lub fałsz, w przeciwnym razie ma wartość fałsz.


releaseLock()

Zwalnia blokadę, aby inne procesy mogły kontynuować oczekiwanie na blokadę. Blokada jest automatycznie zwalniana po zakończeniu działania skryptu, ale dla większej skuteczności najlepiej jest ją odblokować, gdy tylko nie będzie już potrzebny wyłączny dostęp do danej sekcji kodu. Ta metoda nie działa, jeśli blokada nie została nałożona.

Pamiętaj, że jeśli korzystasz z arkusza kalkulacyjnego, wywołaj funkcję SheetApp.flush() przed odblokowaniem blokady, aby zatwierdzić wszystkie oczekujące zmiany w arkuszu kalkulacyjnym, zachowując do niego wyłączny dostęp.

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

tryLock(timeoutInMillis)

Podejmuje próby włączenia blokady. Limit czasu zostaje przekroczony po podanej liczbie milisekund. Ta metoda nie działa, jeśli blokada została już nałożona.

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

Parametry

NazwaTypOpis
timeoutInMillisIntegerczas (w milisekundach) oczekiwania na wprowadzenie blokady

Powroty

Boolean – ma wartość prawda, jeśli blokada została nałożona, lub fałsz, w przeciwnym razie ma wartość fałsz.


waitLock(timeoutInMillis)

Podejmuje próby włączenia blokady, przekroczenie limitu czasu z wyjątkiem po określonej liczbie milisekund. Ta metoda jest taka sama jak tryLock(timeoutInMillis) z tą różnicą, że powoduje zgłoszenie wyjątku, gdy nie można uzyskać blokady zamiast zwracać wartość „fałsz”.

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

Parametry

NazwaTypOpis
timeoutInMillisIntegerczas (w milisekundach) oczekiwania na wprowadzenie blokady

Rzuty

Error – jeśli limit czasu metody upłynął przed uzyskaniem blokady.