SQL Plus では、意図的に commit を実行しない限りトランザクションが終わらないので、二つの行を A クライアントと B クライアントで取り合うように UPDATE 文を実行すると、デッドロックを発生させる事ができます。 デッドロック(ORA-00060)が発生した場合、そちらのクライアントで rollback を実行すると、もう片方では更新が完了するので、そちらで commit を実行して更新を確定させます ▼ 対象レコードA クライアントの SQL
update 商品分類マスタ set 名称 = 'A-野菜' where 商品分類 = 'A01'; update 商品分類マスタ set 名称 = 'A-果物' where 商品分類 = 'A02';
B クライアントの SQL
update 商品分類マスタ set 名称 = 'B-果物' where 商品分類 = 'A02'; update 商品分類マスタ set 名称 = 'B-野菜' where 商品分類 = 'A01';
実行の経過 A クライアントも B クライアントも違う行を更新して、それぞれ行は更新されますが、commit で確定されていないので実際の更新は行われていません。しかし、これらのレコードに対するロックが有効になります。![]()
次の実行で更新が待機になり、その次の更新でデッドロックが起こり、A クライアントで待機が解除されてデッドロックのステータスが返ります。
![]()
デッドロック(ORA-00060)が発生したので、更新はやりなおしになります。いったん rollback を実行して次の更新に備えます( このような処理を何回までリトライするかはシステムであらかじめ決めておきます )
rollback が実行されてロックされていた行が開放されたので、B クライアントでは更新が完了するので、commit で確定させます。
![]()
|
【Oracleの最新記事】
- Oracle : sqlplus で、テーブルの create 文( DBMS_METADATA.GET_DDL ) と csv データを出力する
- SQL*Plusだけで CSV を作成する
- Oracle XE インストール後の環境情報( Windows )
- Oracle11g XE( 無償 ) のインストールからテスト用販売管理データのロードまで
- Oracle Database 11g のJDBC実装では、SIDを使用したデータベースURL接続文字列は廃止されています
- SQLPlus : 置換変数の概要と使い方
- Oracle : スキーマ作成前にテーブルスペースの情報を取得する
- Oracle : 既存スキーマの状態をチェック
- サービス開始 : Oracle 10g Express
- Oracle 10g Express Edition のインストール
- Oracle : 貴重な擬似列 ROWID