Class Lock

Bloquear

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

Essa classe permite que os scripts garantam que apenas uma instância do script execute uma determinada seção de código por vez. Isso é especialmente útil para callbacks e acionadores, em que uma ação do usuário pode causar mudanças em um recurso compartilhado e você quer garantir que não haja colisões.

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

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

Métodos

MétodoTipo de retornoBreve descrição
hasLock()BooleanRetorna verdadeiro se a trava foi adquirida.
releaseLock()voidLibera a trava, permitindo que outros processos que aguardam a trava continuem.
tryLock(timeoutInMillis)BooleanTenta adquirir a trava, com um tempo limite após o número de milissegundos fornecido.
waitLock(timeoutInMillis)voidTenta adquirir a trava, expirando com uma exceção após o número fornecido de milissegundos.

Documentação detalhada

hasLock()

Retorna verdadeiro se a trava foi adquirida. Esse método vai retornar "false" se tryLock(timeoutInMillis) ou waitLock(timeoutInMillis) nunca tiverem sido chamados, se o tempo limite tiver sido atingido antes que a trava pudesse ser recuperada ou se releaseLock() tiver sido chamado.

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

Retornar

Boolean: verdadeiro se a trava foi adquirida, falso caso contrário


releaseLock()

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

Se você estiver trabalhando com uma planilha, chame SpreadsheetApp.flush() antes de liberar a trava para confirmar todas as mudanças pendentes na planilha enquanto você ainda tem acesso exclusivo a ela.

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

tryLock(timeoutInMillis)

Tenta adquirir a trava, com um tempo limite após o número de milissegundos fornecido. Esse método não terá efeito se a trava já tiver sido adquirida.

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegertempo de espera para adquirir a trava, em milissegundos

Retornar

Boolean: verdadeiro se a trava foi adquirida, falso caso contrário


waitLock(timeoutInMillis)

Tenta adquirir a trava, expirando com uma exceção após o número fornecido de milissegundos. Esse método é igual a tryLock(timeoutInMillis), exceto pelo fato de gerar uma exceção quando a trava não pode ser adquirida em vez de retornar falso.

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegertempo de espera para adquirir a trava, em milissegundos

Gera

Error: se o método expirou antes que a aquisição fosse concluída.