Class Lock

Blocca

Rappresentazione di un blocco di mutua esclusione.

Questa classe consente agli script di assicurarsi che solo un'istanza dello script esegua una determinata sezione di codice alla volta. Ciò è particolarmente utile per i callback e i trigger, in cui l'azione di un utente potrebbe causare modifiche a una risorsa condivisa e vuoi assicurarti che non si verifichino conflitti.

L'esempio seguente mostra come utilizzare un blocco in un gestore di invio di moduli.

// 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);
}
Senza il servizio di blocco, se due utenti inviano il modulo quasi contemporaneamente, i numeri dei ticket potrebbero essere uguali, poiché la proprietà lastTicketNumber potrebbe cambiare dopo essere stata letta da ScriptProperties ma prima che il nuovo valore venga riscritto.

Metodi

MetodoTipo restituitoBreve descrizione
hasLock()BooleanRestituisce true se il blocco è stato acquisito.
releaseLock()voidRilascia il blocco, consentendo ad altri processi in attesa del blocco di continuare.
tryLock(timeoutInMillis)BooleanTenta di acquisire il blocco, con timeout dopo il numero di millisecondi fornito.
waitLock(timeoutInMillis)voidTenta di acquisire il blocco, con timeout con un'eccezione dopo il numero di millisecondi fornito.

Documentazione dettagliata

hasLock()

Restituisce true se il blocco è stato acquisito. Questo metodo restituisce false se tryLock(timeoutInMillis) o waitLock(timeoutInMillis) non sono mai stati chiamati, se si è verificato il timeout prima che il blocco potesse essere recuperato o se è stato chiamato releaseLock().

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

Indietro

Boolean - true se il blocco è stato acquisito, false altrimenti.


releaseLock()

Rilascia il blocco, consentendo ad altri processi in attesa del blocco di continuare. Il blocco viene rilasciato automaticamente al termine dello script, ma per efficienza è meglio rilasciarlo non appena non hai più bisogno dell'accesso esclusivo a una sezione di codice. Questo metodo non ha effetto se il blocco non è stato acquisito.

Tieni presente che se lavori con un foglio di lavoro, devi chiamare SpreadsheetApp.flush() prima di rilasciare il blocco, per applicare tutte le modifiche in attesa al foglio di lavoro mentre hai ancora accesso esclusivo.

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

tryLock(timeoutInMillis)

Tenta di acquisire il blocco, con timeout dopo il numero di millisecondi fornito. Questo metodo non ha effetto se il blocco è già stato acquisito.

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

Parametri

NomeTipoDescrizione
timeoutInMillisIntegerTempo di attesa per acquisire il blocco, in millisecondi.

Indietro

Boolean - true se il blocco è stato acquisito, false altrimenti.


waitLock(timeoutInMillis)

Tenta di acquisire il blocco, con timeout con un'eccezione dopo il numero di millisecondi fornito. Questo metodo è uguale a tryLock(timeoutInMillis), tranne per il fatto che genera un'eccezione quando non è possibile acquisire il blocco anziché restituire false.

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

Parametri

NomeTipoDescrizione
timeoutInMillisIntegerTempo di attesa per acquisire il blocco, in millisecondi.

Genera

Error: se il metodo è scaduto prima dell'acquisizione del blocco