ScriptDbによるオブジェクトデータベース (6/6)
作成:2012-07-01 14:14
更新:2012-07-01 14:14
更新:2012-07-01 14:14
■トランザクションとLockService
オブジェクトの修正や削除などを行う場合、注意しなければならないのが「そのオブジェクトは他からもアクセスされているかもしれない」という点です。アクセス中にオブジェクトが消えたり内容が変更されたりすると、予想外のエラーになってしまうこともあるでしょう。
データベースでは、こうした場合に「トランザクション」と呼ばれる処理を行います。これは、あらかじめ指定された範囲内を処理している間、それ以外のところからデータにアクセスできなくするものです。
ScriptDbInstanceには、このトランザクションのような機能はありませんが、その代わりにGoogle Apps Scriptには「LockService」という機能が用意されています。これは使用するオブジェクトをロックする機能を提供するサービスです。このLockServiceは以下のようにして利用します。
処理が完了したら、finallyでtryを抜ける際にLockを「release」で開放します。これによりロックが解除され、外部からオブジェクト利用ができるようになります。これを忘れると、waitLockで指定した時間が経過するまでロックしつづけになってしまうので注意してください。
では、下のリスト欄に簡単な利用例を挙げておきましょう。これは、指定した名前のオブジェクトを初期化(名前以外の値をすべて空にする)するサンプルです。ここではオブジェクトを取得し、各プロパティを変更して保存するまでの処理をLockでロックしてあります。
このLockServiceによるオブジェクトのロックは、ScriptDbにかぎらず、さまざまなところで利用できますので、ここで覚えておくとよいでしょう。
データベースでは、こうした場合に「トランザクション」と呼ばれる処理を行います。これは、あらかじめ指定された範囲内を処理している間、それ以外のところからデータにアクセスできなくするものです。
ScriptDbInstanceには、このトランザクションのような機能はありませんが、その代わりにGoogle Apps Scriptには「LockService」という機能が用意されています。これは使用するオブジェクトをロックする機能を提供するサービスです。このLockServiceは以下のようにして利用します。
var lock = LockService.getPublicLock();LockServiceオブジェクトの「getPublicLock」により、ロックを管理する「Lock」というオブジェクトを取得します。そして、「waitLock」により、ロックする最大期間の設定をします。後は、try内で、外部からアクセスを禁止するトランザクション処理を実行します。waitLockすると、その期間が終了するまで、実行中のスクリプト内で利用しているオブジェクトに外部からアクセスが禁止されます。
lock.waitLock(30000);
try {
……必要な処理を行う……
} finally {
lock.release();
}
処理が完了したら、finallyでtryを抜ける際にLockを「release」で開放します。これによりロックが解除され、外部からオブジェクト利用ができるようになります。これを忘れると、waitLockで指定した時間が経過するまでロックしつづけになってしまうので注意してください。
では、下のリスト欄に簡単な利用例を挙げておきましょう。これは、指定した名前のオブジェクトを初期化(名前以外の値をすべて空にする)するサンプルです。ここではオブジェクトを取得し、各プロパティを変更して保存するまでの処理をLockでロックしてあります。
このLockServiceによるオブジェクトのロックは、ScriptDbにかぎらず、さまざまなところで利用できますので、ここで覚えておくとよいでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
function clearData(){ var name = Browser.inputBox("名前:"); var db = ScriptDb.getMyDb(); var lock = LockService.getPublicLock(); lock.waitLock(30000); try { var result = db.query({name:name}); while(result.hasNext()){ var obj = result.next(); obj.mail = null; obj.tel = null; obj.age = -1; db.save(obj); } } finally { lock.release(); } }
※関連コンテンツ
「Google Apps Scriptプログラミング [中級編]」に戻る