- PR -

ロックの実現方法について

投稿者投稿内容
ぴーたー
会議室デビュー日: 2007/01/30
投稿数: 9
投稿日時: 2007-01-30 15:30
お世話になります。
ASP.NET(C#)でADO.NETを使用し、WEBを作成しているのですが
レコードのロック方法とその制御について悩んでいます。

まず最初にテーブルの一覧をGridViewで表示するlist.aspxを表示します。
GridViewのAutoGenerateEditButtonをTrueにしておきます。

編集のリンクをクリックされたら、edit.aspxがクリックされた
IDのデータをテキストボックスに展開、編集し、保存ボタンで保存するという流れです。

このときに、Aさんが編集画面edit.aspxをID=1で開いている場合に
Bさんが同じID=1の編集をクリックし、edit.aspxを開いた場合は
「現在編集中のため編集できません」というメッセージを表示したいのですが
どのように実現すればよいのでしょうか。

参考となるHP、調べればよいキーワードなど教えていただけると幸いです。
どせい
大ベテラン
会議室デビュー日: 2006/10/25
投稿数: 145
投稿日時: 2007-01-30 16:04
とりあえず楽観的ロックと悲観的ロックについてでも調べてみれば?

書いてある要件からすると悲観的ロックっぽいけど、そこまで必要なのかどうか。
両者について理解してから、Webアプリケーションであることも考慮しつつ、
求められている真の要件と相談するといいかも。

[ メッセージ編集済み 編集者: どせい 編集日時 2007-01-30 16:06 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-30 22:30
 Aさんが ID=1 を編集状態にする。そのままブラウザを終了させてしまった。あるいは、突然会議に呼び出されて帰ってこない。

 じゃぁ、Bさんが ID=1 を編集させようとすると、どうなる?
_________________
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2007-01-31 06:24
下記サイトが参考になるかと。

Hint 1. 同時更新による競合を検出するには?
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_12/vs2005db_12_01.html

Hint 2. 標準的なオプティミスティック同時実行制御の問題点とその解決方法
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_12/vs2005db_12_01.html

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
ぴーたー
会議室デビュー日: 2007/01/30
投稿数: 9
投稿日時: 2007-01-31 09:24
>>どせいさん
要件と再度照らし合わせてみます。

>>Jittaさん
この場合はPageの破棄イベントでCommitされていない場合はRollbackとか
コネクションのCloseとかできないもんなんでしょうか。(Disposeとかで)
sessionタイムアウトや、ブラウザの戻るボタンなども、返信頂いたこのケースと
同様な現象が出そうで、どうしようかと思っていました。

Pageロード時にデータをDBからロードし、テーブルをロック。
そのDbTransactionとDbConnectionのインスタンスを一時的にSessionオブジェクトにいれ
そのページが破棄されるときにCommit状態を判定して、必要ならばRollbackを行い、
ロック、DbTransactionとDbConnectionの開放、
Sessionタイムアウトとブラウザの終了(Page破棄イベントにきそうですが)は
Session_OnEndで開放するというのでも問題ありなのでしょうか。

>>Accessさん
上記のサイトを確認させていただきます。
ぴーたー
会議室デビュー日: 2007/01/30
投稿数: 9
投稿日時: 2007-01-31 16:28
Session_Endで・・と書きましたが、InProcモードは使わないほうがいいみたいですね。
Session_Endに依存した処理もだめのようで。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31062&forum=7

Page_UnloadのイベントもPageのイベント順序を確認してみると
思っていたようなイベントではないようで・・・
(別のページに移って現在のページが破棄される前に呼ばれるイベントだと期待していました)

こうなるとSession変数に入れた値というのはどこで開放すればいいんでしょうか・・・
どせい
大ベテラン
会議室デビュー日: 2006/10/25
投稿数: 145
投稿日時: 2007-01-31 17:10
悲観的ロックの方向で考えたら実装面倒だよね。
もう一度言うけど、そこまで厳しいロックが必要なのかどうか。

前のレスで書いた「真の要件」ってのは、勝手に想像するんだけど
「同時に更新しようとした時でもデータの整合性が保たれればそれでよい」
ということじゃないのかな?

それなら楽観的ロックで十分。きっと十分。
後から競合する更新かけようとした方に「別のひとがデータ更新しちゃったからこっちは処理しないよ」と伝えて更新処理行わなければいいよね。


[ メッセージ編集済み 編集者: どせい 編集日時 2007-01-31 17:18 ]
ぴーたー
会議室デビュー日: 2007/01/30
投稿数: 9
投稿日時: 2007-01-31 17:41
>>どせいさん
たびたびレスありがとうございます。

楽観的、悲観的のどちらにするかの仕様は現在、業務設計者に判断を迫っている状態ですが
とりあえず仕様で判断されるまでの間、悲観的が実装をどうやれば実装できるかを調査しておりました。

おそらく仕様的には悲観的にしたいようですが、楽観的でも問題ないと思われます。
「別のひとがデータ更新しちゃったからこっちは処理しないよ」とおっしゃるとおりで
十分な範囲だと認識しております。

ASP.NETでの悲観的ロックの実装方法に謎が残りますが、今回は楽観的で実装できそうなので
こちらを推し進めるように相談していきたいと思います。

大変参考になりました、返信頂いた皆様ありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)