Class Lock

ロック

相互除外ロックの表現。

このクラスを使用すると、コード内の特定のセクションを一度に 1 つだけ実行するスクリプトを作成できます。これは、ユーザー アクションによって共有リソースが変更される可能性があり、競合が発生しないようにする必要があるコールバックとトリガーに特に便利です。

次の例は、フォーム送信ハンドラでロックを使用する方法を示しています。

// 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);
}
ロックサービスを使用しない場合、2 人のユーザーがほぼ同時にフォームを送信すると、ScriptProperties から読み取られた後、新しい値が書き戻される前に lastTicketNumber プロパティが変更される可能性があるため、チケット番号が同じになる可能性があります。

Methods

メソッド戻り値の型概要
hasLock()Booleanロックが取得された場合は true を返します。
releaseLock()voidロックを解放し、ロックを待機している他のプロセスを続行できるようにします。
tryLock(timeoutInMillis)Booleanロックの取得を試み、指定されたミリ秒数後にタイムアウトします。
waitLock(timeoutInMillis)voidロックの取得を試み、指定されたミリ秒数後に例外でタイムアウトします。

詳細なドキュメント

hasLock()

ロックが取得された場合は true を返します。tryLock(timeoutInMillis) または waitLock(timeoutInMillis) が一度も呼び出されなかった場合、ロックを取得する前にタイムアウトした場合、または releaseLock() が呼び出された場合、このメソッドは false を返します。

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

リターン

Boolean - ロックが取得された場合は true、それ以外の場合は false


releaseLock()

ロックを解放し、ロックを待機している他のプロセスを続行できるようにします。スクリプトの終了時にロックは自動的に解除されますが、コードのセクションへの排他的なアクセスが不要になったらすぐに解除することをおすすめします。ロックが取得されていない場合、このメソッドの効果はありません。

なお、スプレッドシートで作業している場合は、ロックを解除する前に spreadsheetsApp.flush() を呼び出して、スプレッドシートに対する排他的なアクセス権を維持したまま、スプレッドシートに対する保留中の変更をすべて commit する必要があります。

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.');
}

パラメータ

名前説明
timeoutInMillisIntegerロック取得までの待機時間(ミリ秒)

リターン

Boolean - ロックが取得された場合は true、それ以外の場合は false


waitLock(timeoutInMillis)

ロックの取得を試み、指定されたミリ秒数後に例外でタイムアウトします。このメソッドは、ロックを取得できなかった場合に false を返す代わりに例外をスローするという点で tryLock(timeoutInMillis) と同じです。

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

パラメータ

名前説明
timeoutInMillisIntegerロック取得までの待機時間(ミリ秒)

例外

Error - ロックが取得される前にメソッドがタイムアウトした場合