ORACLE10Gを使用したアプリ開発中です。
アプリ中、1テーブルに対して全く同じ条件で
複数レコードを悲観的ロック(for update)しながら取得し、
項目を更新するSQLを発行します。
単発では問題なかったのですが、処理時間の関係で
パラレルで実行された場合にデッドロックを検出することがあります。
ORACLEのudumpの中を確認すると全く同じSELECTのSQL同士で
デッドロックが発生したと表示されています。
こういった場合、どういう原因が考えられるでしょうか?
(同じ条件による悲観的ロックであれば多重実行でも
処理待ちをするだけだと思っているのですが・・・)
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
>2つの処理がロックしてしまう、というように聞こえますが
>こういうことはあるんでしょうか?
あるんです。Aのプロセスも、Bのプロセスも「誰もロックしてない」って思ってますから。
Aがロックを掛けた直後に、Bは「さっき調べた時は誰もロックしてなかったから、ロックしよう」と「上書きロック」をしてしまいます。
通常は1と3の間に2が割り込まず、2が後回しになる為、以下のようにAもBも正常終了します。
1.Aがレコードのロック状態を検査。ロック無しと判定
3.Aがレコードをロック
2.Bがレコードのロック状態を検査。ロック有りと判定
4.Bはレコードのロックが解除されるまで待ち合わせ
(以下略)
デットロックの直接の原因は「間に割り込みが入らず一連の動作として処理しなければならない、ロック状態の検査とロック設定の間に、別プロセスが割り込むため」です。
こういうケースは、データベースがサーバー上にあり、アクセスがネットを介して行われる場合で、2つのプロセスが同時に同じ処理を行った際に多発します。
回避には、独自にセマフォ変数やミューテックス変数を用意するなどして「データベースのロック機能以外を使って」排他制御が必要です。
ご回答ありがとうございます。
こういうことはDBMS上ありえないと勝手に思ってました。
おかげで対処できそうです。
色々ありがとうございました。
No.1
- 回答日時:
下記タイミングで処理されるとデットロックします。
1.Aがレコードのロック状態を検査。ロック無しと判定
2.Bがレコードのロック状態を検査。ロック無しと判定
3.Aがレコードをロック
4.Bがレコードを再ロック
5.Aが更新の為にレコード取得を試みる。が、4でBにロックされている為、ロックが解除されるまで処理待ち
6.Bが更新の為にレコード取得を試みる。が、3でAにロックされている為、ロックが解除されるまで処理待ち
7.めでたくデットロック
実際の処理では、レコードのロック以外に、テーブルのロック、システムテーブルのレコードロックとかも行うので、レコードロックとテーブルロックなどがかち合って、もっと楽しい事(※)が起きます(笑)
(※)サーバーをリブートしないと復活しないとか、サーバーをリブートしても復活しないとか、色々。起きると死にそうな目に遭う。
ご回答ありがとうございます。
ちょっとだけ追加でご質問させてください。
>1.Aがレコードのロック状態を検査。ロック無しと判定
>2.Bがレコードのロック状態を検査。ロック無しと判定
>3.Aがレコードをロック
>4.Bがレコードを再ロック
というところですが、同時実行だと同一のレコードに対して
2つの処理がロックしてしまう、というように聞こえますが
こういうことはあるんでしょうか?
私の記述がわかりにくかったかもしれませんが、
今回の対象は2つの処理で全く同じレコード郡に対しての
同時実行であった為です。
もし同時実行で後続の処理が同じレコードを
再ロックするなんてことがあるのならちょっと
考えないといけなそうなので^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Oracle SQL update方法 2 2022/06/22 14:07
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
【お題】・忍者がやってるYouTubeが炎上してしまった理由
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
SELECT文でのデッドロックに対しての対処方
SQL Server
-
デッドロックに関しての質問
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
他の処理でselectさせないよう...
-
1件あたりの処理時間を検討する...
-
チューニング対象のSQLの見つけ...
-
RDBのテーブル種類の違い
-
DELETE文でFROM句を省略した場合
-
PL/SQLの平行処理について
-
select for updateのロック
-
PL/SQLでの処理について
-
[性能改善]AccessのDBに大量の...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
カラムの存在チェック
-
SQLでスキーマ名(所有者名)の...
-
Viewにインデックスは張れ...
-
ACCESS 複数テーブル・複数フィ...
-
異なるスキーマからビュー作成
-
Data Pump で大量データインポ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
他の処理でselectさせないよう...
-
accessでイベントを中止するよ...
-
年度毎にシーケンスの初期化?
-
Oracleから見たOracleの優位性(...
-
[性能改善]AccessのDBに大量の...
-
PL/SQLの平行処理について
-
統計情報の取得=コミットですか?
-
select for updateのロック
-
DBリンクエラーについて
-
PL/SQLでmdb(Access)ファイルへ...
-
Select時に取得行番号を指定す...
-
ActiveX DLLでのオラクルのトラ...
-
処理速度の見積もり時間について。
-
Access2013で操作ログを残した...
-
同一レコード更新時の排他制御
-
チューニング対象のSQLの見つけ...
おすすめ情報