2013年7月17日水曜日

GeneXusにおけるロック・排他制御

GeneXusにおいてデータベース更新処理(INSERT/UPDATE/DELETE)が可能なオブジェクトはトランザクションとプロシージャのみです。

データベース更新処理としてはロックと排他が重要な制御になってきますが、GeneXusでの仕様は以下の通りです。

トランザクションオブジェクト

1)ロック

  • 書き込み処理の直前にSELECTを実行しますが、その時のモードがLOCKモードになります。( Oracleだとfor update no wait指定/SQLServerだと WITH (UPDLOCK)指定 )
  • もし、ロックが失敗した場合(既に他のユーザーにロックされていた場合)はエラーが返されます。

2)排他制御

  • トランザクションオブジェクト内で独自の排他制御が実装されています。
  • レコードをLoad時(SELECT時)のデータを全て保持しておき、書き込みの直前のSELECT(上記ロック時)で取得した項目と全項目付け合わせをします。一項目でも差があれば他の誰かが変更を加えたと判断し排他エラーが返ります。= 楽観的排他
  • 一般的には更新回数や更新タイムスタンプ項目を設け、その項目を用いた比較で排他制御を実装するのが一般的だと思いますが、GeneXusの場合はトランザクション=テーブルではないのでストラクチャーで定義されている全項目の比較になります。


プロシージャオブジェクト

1)ロック

  • for eachによる更新処理にて、条件項目および更新対象項目がベーステーブルにある場合は、UPDATE/DELETE文が生成されます。
  • for eachによる更新処理にて、条件項目および更新対象項目がベーステーブル以外にもある場合は、SELECT文(条件指定用+ロック用)とUPDATE/DELETE文が生成されます。この場合は、トランザクションと同様にロックモードでのSELECTになります。



2)排他制御

  • 排他制御は盛り込まれていません。アプリケーションの仕様として開発者が実装する必要があります。


悲観的排他が必要な場合は、独自に設計し実装する必要があります。



0 件のコメント:

コメントを投稿