Class Lock

Замок

Представление взаимоисключающей блокировки.

Этот класс позволяет скриптам убедиться, что только один экземпляр скрипта выполняет данный раздел кода за раз. Это особенно полезно для обратных вызовов и триггеров, когда действие пользователя может вызвать изменения в общем ресурсе, и вы хотите убедиться, что нет конфликтов.

В следующем примере показано, как использовать блокировку в обработчике отправки формы.

// 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);
}
Без службы блокировки, если два пользователя отправят форму примерно в одно и то же время, номера заявок могут оказаться одинаковыми, поскольку свойство lastTicketNumber может измениться после того, как оно будет прочитано из ScriptProperties , но до того, как новое значение будет записано обратно. .

Методы

Метод Тип возврата Краткое описание
hasLock() Boolean Возвращает true, если блокировка была получена.
releaseLock() void Освобождает блокировку, позволяя другим процессам, ожидающим блокировку, продолжить работу.
tryLock(timeoutInMillis) Boolean Попытки получить блокировку, время ожидания истекает через указанное количество миллисекунд.
waitLock(timeoutInMillis) void Попытки получить блокировку с истечением времени ожидания с исключением после указанного числа миллисекунд.

Подробная документация

hasLock()

Возвращает true, если блокировка была получена. Этот метод вернет false, если tryLock(timeoutInMillis) или waitLock(timeoutInMillis) никогда не вызывались, истекло время ожидания до того, как блокировка может быть извлечена, или если был вызван releaseLock() .

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

Возвращаться

Boolean — true, если блокировка была получена, иначе false


releaseLock()

Освобождает блокировку, позволяя другим процессам, ожидающим блокировку, продолжить работу. Блокировка снимается автоматически, когда скрипт завершает работу, но для эффективности лучше снять ее, как только вам больше не нужен эксклюзивный доступ к разделу кода. Этот метод не действует, если блокировка не была получена.

Обратите внимание, что если вы работаете с электронной таблицей, вы должны вызвать SpreadsheetApp.flush() перед снятием блокировки, чтобы зафиксировать все ожидающие изменения в электронной таблице, пока у вас есть эксклюзивный доступ к ней.

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

tryLock(timeoutInMillis)

Попытки получить блокировку, время ожидания истекает через указанное количество миллисекунд. Этот метод не действует, если блокировка уже получена.

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

Параметры

Имя Тип Описание
timeoutInMillis Integer как долго ждать получения блокировки, в миллисекундах

Возвращаться

Boolean — true, если блокировка была получена, иначе false


waitLock(timeoutInMillis)

Попытки получить блокировку с истечением времени ожидания с исключением после указанного числа миллисекунд. Этот метод аналогичен tryLock(timeoutInMillis) за исключением того, что он выдает исключение, когда блокировка не может быть получена, вместо возврата false.

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

Параметры

Имя Тип Описание
timeoutInMillis Integer как долго ждать получения блокировки, в миллисекундах

Броски

Error — если время ожидания метода истекло до получения блокировки