DataSetを使用してデータベースからデータを取得しているのですが、その際の排他制御に関して質問です。
###実現したいこと
Form1:SQLを発行しデータ取得,Form2に表示
↓
Form2:データ閲覧 データに対して変更を加える
↓
SQL発行し、データベースに反映
上記フローのデータ取得時からデータベースに反映までの間,排他制御を行いたい。
質問内容
上記のようにセッションを跨いで排他制御をかけたいときは、
悲観的排他制御ではなく楽観的排他制御を使用したほうがいいのでしょうか?
初歩的なことかもしれませんがご回答くださると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
悲観的排他制御ではなく楽観的排他制御を使用したほうがいいのでしょうか?
どちらがいいかは状況が分からない第三者には分かりません。
言葉の通り「楽観的」(あまり同時実行は起こらないし、起こってもユーザーにその旨通知してキャンセルすれば許される) でよければ、楽観的同時実行制御一択だと思います。
Visual Studio のデータソース構成ウィザードで型付き DataSet/DataTable + TableAdapter を作れば、楽観的同時実行制御の機能をほとんどコードを書かなくても実装できます。
ちなみに、SSMS には同時実行制御の機能が付いていて、編集作業を行っているときに、更新をかける前に他で変更されていたりすると、その旨メッセージが表示されます。
【追記】
追加情報を書いておきます。
以下の記事が参考になると思います。特に「楽観的同時実行制御と悲観的同時実行制御」のセクションを見てください。
DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)
質問者さんは DataSet を利用した非接続型アクセスを行っているようですが、であれば、そこに、
"DataSet の DataAdapter 経由の更新においては、非接続データアクセスと楽観的同時実行制御が基本となっており、それをベースにシステム実装を図ると、自ずとスケーラビリティの向上が図れる"
・・・と書いてありますように、楽観的同時実行制御の採用をまず考えることをお勧めします。
上にも書きましたが、Visual Studio のデータソース構成ウィザードで型付き DataSet/DataTable + TableAdapter を作れば、楽観的同時実行制御の機能をほとんどコードを書かなくても実装できます。
投稿2020/10/15 23:03
編集2020/10/16 01:07退会済みユーザー
総合スコア0
0
どういうロックが必要かは必要要件で変わってきますので何とも言えませんが、
セッションを跨ぐ場合、同時編集させたくない編集画面のレコードをロックテーブルで判定するというのをやった事はあります。
- ロックテーブルに更新対象のプライマリーキーでinsertできたユーザーだけ編集出来るようにする
- ロックしたユーザー、ロック時間等の付加情報も付けておく
- 編集画面が終わった時点でロックテーブルのレコードを削除する
- 編集中にアプリ(PC)が落ちた場合はロックテーブルのレコードが残るので、何らかの解除手段は用意する
投稿2020/10/16 00:19
編集2020/10/16 00:22退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SELECT 時に明示的な行ロックを行なう方法 を参考に。
COMMIT ;
で確定して、ロックを解除します。
ROLLBACK ;
更新を取り消して、ロックを解除します。(エラー時の取り消し用途)
過去、100本以上のPL/SQLでテーブル1つ毎のCOMMITしているとんでもない作られたシステムを見たことがあります。お客様には詐欺にあったという自覚は持ちましょう、と伝えて1日で調査を終わりました。
投稿2020/10/15 20:30
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/15 20:50
2020/10/15 23:51
退会済みユーザー
2020/10/16 10:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/16 10:08
退会済みユーザー
2020/10/16 10:15
退会済みユーザー
2020/10/16 10:48