GASの排他処理[LockService]の3つのget〜Lock処理の違いを調べた

はじめに

GASで同時実行を避けるために排他処理を行いたい場合、LockServiceというサービスを利用できます。

このサービスでロックを取得する際に3つの異なるロック取得方法があるため、それぞれの特徴についてまとめてみました。

公式のリファレンスはこちら↓

Lock Service  |  Apps Script  |  Google for Developers

この記事のまとめ。

  • getScriptLock、getDocumentLock、getUserLockの違いは排他処理を行う際のスコープ
  • 3つに共通し、プロジェクト内で共有のロックとなるため、複数関数を1プロジェクトで管理している場合は注意
  • 基本的な、プロジェクトごとのロックで良い場合はgetScriptLockを使う
  • 異なるドキュメントからの呼び出しについては別ロックとしたい場合はgetDocumentLockを使う
  • 実行ユーザーごとに別ロックとしたければgetUserLockを使う

getScriptLock()の仕様

プロジェクトごとのロックをかける

  • 実行ユーザーを問わず、同じプロジェクト内で行われたロックに対しての排他処理が行われます。
  • 3つのロックの掛け方に共通して同じプロジェクト内の他の関数内でロックをかけた場合でも排他処理が行われてしまうので1プロジェクトの中で複数の独立する関数を運用している場合には要注意。

getDocumentLock()の仕様

ドキュメントごとのロックをかける

  • 実行ドキュメント単位で排他処理が行われます。
  • 同じドキュメントから実行した場合は、実行ユーザーが同じ場合も異なる場合も排他処理が行われます。
  • 異なるドキュメントからgetDocumentLockを使用する同じライブラリを読み込んで実行した場合には排他処理が行われません。

ドキュメントから呼び出されない処理の場合には利用不可

  • Googleフォーム、スプレッドシートなどのGASが実装可能なドキュメントから呼び出すファンクションの場合のみこのgetDocumentLock()が使用できます。
  • トリガー実行、Webアプリとしての実行などのドキュメントを介さない実行方法で呼び出す場合はgetDocumentLockはnullを返却するため、その後のロック処理でエラーとなってしまうので注意。

なお、ドキュメントに紐づくプロジェクトの場合はエディタからの実行の場合はnullとならず利用できます。

getUserLock()の仕様

ユーザーごとのロックをかける

  • 実行ユーザー単位で排他処理が行われます。
  • 同じユーザーが実行した場合は、排他処理が行われる。異なるユーザーの場合処理が行われません。

以上です。ここまで読んでくれた方ありがとうございました。この情報がお役に立てれば嬉しいです!

コメントフォーム