SAK 図書館
VB テクニック編28 - データベースレコードの特別な排他制御
■SAK 関数利用規程
・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
・著作権明示部分の改編は認めない。
・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
プログラムを開発することは自由です。
・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
その他有償プロダクトとして配布・販売するには、私の許可が必要です。
(無償のフリーソフトウェアなら、自由に配布しても良い。)
・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
賠償しません。
■排他制御、レコードロック
・Oracle や mdb では、リードオンリーで単純に参照したようなレコードアク
セスは普通は知りようがありません。
更新でアクセスしたレコードは、排他モードの設定によって、ロックされて
いれば次のユーザは参照できません。(エラーが返ります。)
・通常の排他制御では、マルチユーザ環境でどうしてもデッドロックが起こり
やすいと思います。(設計にもよりますが。)
私の場合は、ロック時間を最小になるように設計しています。
■特別な排他制御、デッドロック回避
・例えば、
【パターン1】
1. ユーザA - レコード呼出
2. ユーザB - 同一レコード呼出
3. ユーザA - レコード更新
4. ユーザB - レコード更新 (マルチユーザ更新チェック)
既に他ユーザが更新したので、最新内容を自動表示
【パターン2】
1. ユーザA - レコード呼出
2. ユーザB - 同一レコード呼出
3. ユーザB - レコード更新
4. ユーザA - レコード更新 (マルチユーザ更新チェック)
既に他ユーザが更新したので、最新内容を自動表示
のように、呼び出してからデータ入力時間がいくらかかっても問題のない
ようにしてます。(ロックは実更新の瞬間にだけ実施。)
このような特別な排他制御をしないと、システムによってはレコードの
整合性がとれなくなります。
・標準的な排他制御では、常に後に更新したものが有効になってしまいます。
この場合、先にレコードが削除されたりすると更にやっかいです。
整合性を保つためには、参照時からレコードロックして、長時間ロックする
必要があります。するとデッドロック発生率が一挙に高まります。
・と言うわけで、マルチユーザシステムでの排他制御は、どうしても私のよう
な特別な排他ロジックをシステムに組み込む必要があると思います。
この特別な排他制御は、提供機能ではなく、自分でロジックを作るしかあり
ません。
■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料