2012 年 9 月 21 日 金曜日
Google Apps Scriptで作成したスクリプトは、複数のクライアントから同時に実行することができるが、複数のプロセスを並行して走らせることにより、データが破壊されたり、不整合が生じることがある。2ページに渡り、回避する方法を紹介する。
あるユーザーAがGoogleカレンダーの自分の予定一覧をスプレッドシートに書き込むスクリプトを実行している最中に、ユーザーBも同じ処理を、同じタイミングで実行させることができる。
複数のプロセスを並行して走らせることは、ウェブアプリケーションではごくごく当たり前で、特に意識することも無いかもしれないが、並行して走らせることにより、データに不整合が生じることがある。
特に複数人が1つのリソースに対して同時に変更を加えることがある場合、データの不整合、あるいは破壊が発生しやすい。
自分の1年間の予定一覧を、スプレッドシートに書き込む処理を例に挙げる。同時に実行されることを意識しなかった場合、以下のようなスクリプトになる。
14行目の書き込み開始位置を決定する箇所に注目して欲しい。
function getMyEventList(){
var myCalendar = CalendarApp.getDefaultCalendar();
//2011年1月1日から2012年1月1日までの予定を取得
var events = myCalendar.getEvents(
new Date('2011/1/1'),
new Date('2012/1/1'));
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//書き込み開始行をここで決める。
//最終行+1行目から開始。
var start = sheet.getLastRow()+1;
//取得した予定をスプレッドシートに出力
for(var i=0; i
この処理を複数人が同時に実行した場合、どうなるか。
まず、Aさんが最初にスクリプトを実行する。
1行目から順にAさんの予定が書き込まれていく。
スプレッドシートへの書き込みが50行目まで進んだところで、Bさんがスクリプトを実行。
Bさんが実行したプロセスでは、最終行が50行目ということになっているので、51行目から書き込みが開始される。
Aさんの実行したプロセスでは、Bさんのプロセスに関係なく、51行目、52行目、と予定を書き込んでいく。その後を追って、Bさんの実行したプロセスにより、Bさんの予定が51行目、52行目に上書きされてく。最終的には、51行目以降はすべてBさんの予定で埋め尽くされることになる。これは非常に問題である。
そこで、LockServiceの出番となる。
続き:Lock Serviceでスクリプトを堅牢にする (2/2)
関連記事
コメントをどうぞ
トラックバック
このエントリーのトラックバックURL:
http://www.bmoo.net/archives/2012/09/314715.html/trackback