Class Lock

Bloquear

Uma representação de um bloqueio de exclusão mútua.

Esta classe permite que os scripts garantam que somente uma instância do script execute um determinado seção de código por vez. Isso é particularmente útil para callbacks e gatilhos, em que um usuário pode causar alterações em um recurso compartilhado e você quer garantir que não haja ou colisões.

O exemplo a seguir mostra como usar um bloqueio em um gerenciador de envio de formulário.

// 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);
}
Sem o serviço de bloqueio, se dois usuários enviarem o formulário aproximadamente ao mesmo tempo, o tíquete os números podem acabar iguais, já que a propriedade lastTicketNumber pode mudar depois foi lido no ScriptProperties, mas antes que o novo valor fosse gravado de volta.

Métodos

MétodoTipo de retornoBreve descrição
hasLock()BooleanRetorna "true" se o bloqueio foi adquirido.
releaseLock()voidLibera o bloqueio, permitindo que outros processos que aguardam o bloqueio continuem.
tryLock(timeoutInMillis)BooleanTenta adquirir o bloqueio, expirando após o número fornecido de milissegundos.
waitLock(timeoutInMillis)voidTenta adquirir o bloqueio, expirando com uma exceção após o número fornecido de milésimos de segundo.

Documentação detalhada

hasLock()

Retorna "true" se o bloqueio foi adquirido. Esse método retornará "false" se tryLock(timeoutInMillis) ou waitLock(timeoutInMillis) nunca foram chamados, expiraram antes que o bloqueio pudesse ser recuperado ou se releaseLock() fosse chamado.

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

Retornar

Boolean: verdadeiro se o bloqueio tiver sido adquirido. Caso contrário, falso.


releaseLock()

Libera o bloqueio, permitindo que outros processos que aguardam o bloqueio continuem. A fechadura está liberada automaticamente quando o script é encerrado, mas para eficiência é melhor liberá-lo assim que você não precisar mais do acesso exclusivo a uma seção de código. Esse método não tem efeito se o bloqueio não tiver sido adquirido.

Se você estiver trabalhando com uma planilha, chame SpreadsheetApp.clean() antes de liberar o bloqueio, para confirmar todas as alterações pendentes na planilha enquanto ainda têm acesso exclusivo a ela.

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

tryLock(timeoutInMillis)

Tenta adquirir o bloqueio, expirando após o número fornecido de milissegundos. Esse método não terá efeito se o bloqueio já tiver sido adquirido.

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegerquanto tempo esperar para adquirir o bloqueio, em milissegundos;

Retornar

Boolean: verdadeiro se o bloqueio tiver sido adquirido. Caso contrário, falso.


waitLock(timeoutInMillis)

Tenta adquirir o bloqueio, expirando com uma exceção após o número fornecido de milésimos de segundo. Esse método é igual a tryLock(timeoutInMillis), mas gera uma exceção. quando não é possível adquirir o bloqueio em vez de retornar "false".

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegerquanto tempo esperar para adquirir o bloqueio, em milissegundos;

Gera

Error: se o método expirar antes do bloqueio ser adquirido