プロが教える店舗&オフィスのセキュリティ対策術

処理の流れとしてはこうです。

1.販売テーブルをごっそり取得
~~販売テーブルの1レコードずつループ開始~~
2.色々処理
3.販売テーブルの主キーと削除フラグを指定して、再び1レコード取得
4.3.で取得出来たら、その1レコードの中にあるチェックフラグをオンに更新
5.2.へ戻る(次のレコードの処理へ)
~~販売テーブルの1レコードずつループ終了~~

上記の処理の3.をやってる意味が分からないです、販売テーブルを1.でごっそり取得したわけですが、
そのごっそり取ったリストにもプライマリキーのカラムの値が格納され、3.でそのプライマリキーをキーに取得しているのですから、3.で取得できるのは当たり前だと思うのです。
更新する前に3.で取得している理由はなんでしょうか?
1.と3.の間で削除フラグがオンになった場合は、3で取得できなくなり更新処理へは行かなくなるのですが、削除フラグは基本的に立ちませんし、更新のSQLにも削除フラグがあるため3の処理がなくても更新はされません。更新結果0件になるだけです。

どんな理由が考えられますか?

A 回答 (1件)

データベースは複数の人が同時に利用します。


Aさんが、データを読み込んで何か処理した後、いざ書き込もうとしたとき、そのデータが、Aさんが読み込んだ後、Bさんによってすでに変更されていることがあります。
この場合、そのまま書き込んでしまうと、Bさんの変更したデータを上書きしてしまいます。
こういう競合問題を防ごうとしているのかもしれません。

一般的にDBで更新処理を行う場合、排他制御を行いますが、楽観ロックは、オプティミスティック ロックといい。レコードは、変更がデータベースにコミットされるときにのみロックされます。
もうひとつは、ペシミスティック ロックで。レコードは、編集されている間、ロックされます。

マイクロソフトのVisualStudioで、EntityFrameworkとか、その前の世代のフレームワークを使ってDBを処理すると、自動的に楽観ロックの処理が組み込まれるので、その存在が分からないこともあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!