oracleのupdateについて
お世話になっております。
oracleのupdateについて教えてください。
(1)以下のような更新のupdateを実行し、
update dept set updt_flag=1 where id=1111;
(2)commitをする間に別ユーザが以下のupdateを実行したとします。
update dept set updt_flag=0 where id=1111;
上記のような状況を再現した際、
(2)のupdateは(1)のcommitが完了するまで待つという結果になりました。
ここで質問なのですが、
最初のupdateが完了するまで別のupdateは待っているというのが
暗黙のルールなのでしょうか?
初歩的な質問ですみません。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
1文ずつのSQLではこの機構の大事さがピンと来ないかも知れませんね。
(1)のユーザが、updt_flagを1にした後、コミットされるまでに1になっていることを前提に
実施される処理を考えてみてください。
つまり、「updt_flag」を1にするSQLを実施している最中とか直後に、0に戻されている
可能性があるとしたら、
「updt_flag」を1にupdateする
行為そのものが信用出来なくなりませんか?
「1にしたけど、もしかしたら同時に0にされてるかもしれない」
「1にしたけど、もしかしたら同時に10にされてるかもしれない」
:
一々、Select文で「1のままだよね?」って確認したとしても、その確認の最中とか直後に
また同じ心配が発生しちゃいます。
常時監視するしかないですかね?変更があったら自動的に通知されるような仕組みを作る?
その通知を受け取ったら、「1にする処理が信用出来なくなった」として処理を変更?
・・めんどくさいというよりナンセンスですよね。
一連の処理(=「トランザクション」と言います)が完了して、じゃ、次の処理で「updt_flag」
(在庫数かもしれないし、許可フラグかも知れないし)を操作して良いよ、というところまで、
データは不変でなければいけません。
=「データの一貫性」が守られないとDBを使ったプログラム・操作が出来ませんのでデータを
ロックする(守る)必要がある、ということです。
ちなみに、ロックされているデータを使いたい方から見れば、ロックされてるか(フリーズした
みたいになっちゃいますから)知りたいって時は、(2)の
update dept set updt_flag=0 where id=1111;
のときに、
select updt_flag from dept where id=1111 for update nowait;
とすると、前の処理の完了(commitか、rollback)を待たずに、「ロックされてたよ」とエラー
を出して制御が戻ってきます。(試してみてください)
ORA-00054:リソース・ビジー、NOWAITが指定されていました。
10秒だけ待つ、なんて書き方も出来ます。
select updt_flag from dept where id=1111 for update wait 10;
一連の処理同士が開放を待ち合ったまま動けなくなるデッドロックや、ロックされている行数が
増えたら表全体のロックにエスカレーションしたり、Insert・Deleteの場合はとか・・ロック戦略
は奥が深いです。
↓この辺の用語を理解出来ると、その制御を実現するために不可欠な仕組みだという事が
理解出来るでしょう。
排他制御、ダーティ・リード、ファントム・リード、ACID特性
当然、これらの概念はDB共通です。
※すいませんがSQLは(合ってると思いますが)実際に検証してません。
SQLのマニュアル参照してください。
こんばんは。
すごくご丁寧な回答、ありがとうございます。
初心者の自分も理解することができました。おっしゃる通り、一回一回確認していたのでは信用性が無くなってしましますね。
教えていただいた用語について、勉強してみます。
本当にありがとうございます!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL UPDATE my_items SET item_name '赤い,甘い,ケーキ' WHERE id 1 2023/01/03 09:52
- Windows 10 windows11 update の「更新の再開」について初歩的な質問なのですが 1 2022/10/19 00:57
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
- VPN 何これ 1 2022/04/19 01:32
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- タブレット タブレット内でキーボードを出す良い方法を知っている方、教えて下さい。 3 2022/05/26 05:59
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Oracle update文で質問です。 下記の条件でupdateをしたいですが、どのようにしたら良いでしょうか。 2 2022/06/23 10:51
- Windows 10 Windows 11の累積更新プログラム KB5016629 がインストール出来ない。 2 2022/08/16 12:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他の処理でselectさせないよう...
-
DELETE文でFROM句を省略した場合
-
年度毎にシーケンスの初期化?
-
PL/SQLの平行処理について
-
DBリンクエラーについて
-
object browser で処理を中断す...
-
同じSELECT文同士でのデ...
-
RDBのテーブル種類の違い
-
accessでイベントを中止するよ...
-
チューニング対象のSQLの見つけ...
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
異なるスキーマからデータを抽...
-
SQL*Loaderで、データを加工し...
-
ACCESS 複数テーブル・複数フィ...
-
CLOB型へのINSERT
-
INDEXの無効化
-
エクセルからアクセスにインポ...
-
SQLでスキーマ名(所有者名)の...
-
ORA-00959: 表領域'****'は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
他の処理でselectさせないよう...
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
[性能改善]AccessのDBに大量の...
-
accessでイベントを中止するよ...
-
統計情報の取得=コミットですか?
-
チューニング対象のSQLの見つけ...
-
PL/SQLの平行処理について
-
処理速度の見積もり時間について。
-
Truncate以外で高速にテーブル...
-
ActiveX DLLでのオラクルのトラ...
-
stored procedureの引数について
-
トリガーにてUTL_FILEパッケー...
-
Access2013で操作ログを残した...
-
Oracleから見たOracleの優位性(...
-
年度毎にシーケンスの初期化?
-
Oracleの欠点
-
処理が終わったり終わらなかっ...
おすすめ情報