Oracle9iです。
C/S開発で、VB.NETで画面を開発します。
DBの更新は、画面よりストアドプロシージャを使って行います。
複数ユーザが同一レコードを同時に参照し、同一レコードに対して更新された場合、参照時の更新日時と異なる場合はエラーとするよう設計されています。(つまり、後更新はエラー)
この排他チェックロジックを画面側で実装しようとしておりますが、この排他チェックロジックを画面側で実装せずに、Oracleよりエラーレコードを受け取ることによる排他制御を行うことはできないでしょうか?
ご教授のほどよろしくお願いいたします。
また、参考サイトあれば、その紹介だけでも助かります。
No.3ベストアンサー
- 回答日時:
内容からすると画面にデータを取得し、編集してDBを更新するといったアプリケーションですよね?
このケースで、更新先勝ちの仕組みを作るには画面とストアドの両方で考慮が必要になります。
更新日時を排他項目として使用するなら、参照時に、更新日時も取得します。データ編集後、ストアドへのパラメータとして編集データ+参照時に取得した更新日時を渡します。ストアドでは、updateの条件句にパラメータの更新日時を付け加えてやれば、既に他のユーザーによって更新されていた場合は、更新件数=0件となります。
一般的には「楽観的排他制御」という考え方です。
排他制御に関しては、システムの規模や運用レベルによって数種類の実装方針がありますので、参考URLも見ておいてください。
参考URL:http://www.atmarkit.co.jp/fdotnet/entwebapp/entw …
楽観的排他制御ですか?
初めて聞きました。。。
煩雑な排他チェックの大部分ををストアドに依存させるのですね?
なるほど・・・。
ちょっとこの線でも検討してみます。
ありがとうございました!
No.4
- 回答日時:
私もNo.2だと思うのですが、それで不都合なのであれば
もっと簡単な方法で。
DB上、レコードに"更新ユーザID"のような項目を設けておいて
select → 画面表示 → 画面編集 → update
のselectの前にselectするレコードにユーザID登録するように
してしまってはどうでしょうか。
他ユーザに参照専用(読取専用)として画面表示させることも簡単ですよね。
いわゆるVSSなんかで言うところのチェックアウトの概念です。
No.2
- 回答日時:
クライアントがトランザクションを区切らなければ、
更新目的でデータを参照した時点で、他のクライアントの
参照を抑制することは可能です。
select * from hoge where ~ with update;
というように、"with update"付きであれば、select時点で、
他に同じレコードを"with update"付きで問い合わせているセッションがあれば、
トランザクションが終わるのを待ち合わせます。
待ち合わせをせずに、止めるのであれば、"with update nowait"とすることで、
即時に戻ってきます。(参照できなかったので、ora-xxxxのエラー付きです)
これにより、参照~更新~コミットの区間における、複数セッションで同時処理は
抑制できますので、アプリケーション側で、更新日時をチェックするなどの方法は
とらずに済みます。
参考までに、アプリ側で、日時のチェックを行っても、時間の精度の問題で、
同時処理を抑制しきれるとは言い切れません。
(サーバが速すぎると、参照~更新~コミットが、速すぎて、チェックしきれない)
#1どの
>SQLCODEにてORA-XXXXの部分のエラーコードが返ってきますので、
そんなの無理では??
他セッションで、更新後コミットするまでの間しかエラーになりませんよ?
参照ロックですね。
そうすると、画面を使用するユーザには、更新目的参照 か 参照のみ か 選択させる必要があるということでしょうか?
スプレッドシートで更新できる仕組みの場合は、表示レコード分ロックしてしまうので、ちょっときついかもしれません・・・。
でも、大変勉強になりました!
ありがとうございました!
No.1
- 回答日時:
例外処理を組み込んでおけばSQLCODEにてORA-XXXXの部分のエラーコードが返ってきますので、それをみて排他ロックが掛かっていたら○○、という形でできたと思います。
参考URL:http://jibun.atmarkit.co.jp/fengineer/rensai/omg …
え!? それだけでいいの?
・・・と、びっくりしました。
ありがとうございます!
えっとすみません。。。これは、同一レコードに対して「同時更新」のケースでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他の処理でselectさせないよう...
-
DELETE文でFROM句を省略した場合
-
同じSELECT文同士でのデ...
-
RDBのテーブル種類の違い
-
accessでイベントを中止するよ...
-
object browser で処理を中断す...
-
Oracleから見たOracleの優位性(...
-
Viewにインデックスは張れ...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
postgreSQLのint型は桁数指定が...
-
Data Pump で大量データインポ...
-
viewのバックアップ
-
datapumpの実行方法について
-
ACCESS 複数テーブル・複数フィ...
-
シノニムってエイリアスのエイ...
-
Access レコードを追加できませ...
-
テーブルからのselectにおいて...
-
oracleのプライマリ・キー名の変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
RDBのテーブル種類の違い
-
他の処理でselectさせないよう...
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
[性能改善]AccessのDBに大量の...
-
ActiveX DLLでのオラクルのトラ...
-
accessでイベントを中止するよ...
-
PL/SQLの平行処理について
-
チューニング対象のSQLの見つけ...
-
処理速度の見積もり時間について。
-
Oracleから見たOracleの優位性(...
-
年度毎にシーケンスの初期化?
-
DBリンクエラーについて
-
UPDATE がうまくいかない
-
カーソルについて
-
Access2013で操作ログを残した...
-
ロングトランザクションについて
-
Truncate以外で高速にテーブル...
-
PL/SQLでmdb(Access)ファイルへ...
おすすめ情報