Oracleデータベースで実行中のUPDATE文を途中で強制終了した場合の挙動について説明します。
トランザクションの扱い
- COMMITやROLLBACKの実行がない場合:
UPDATE文が実行中に強制終了した場合、そのトランザクションは中断されたままとなります。- 変更内容はまだデータベースに適用されておらず、一時的な変更として保持されています。
- 少なくとも明示的に
COMMITやROLLBACKが実行されていない限り、そのトランザクションは「保留中」となっています。
ロックの状態
- トランザクションとロック:
UPDATE文が実行された行はトランザクションが終了するまでロックされています。そのため、他のセッションからはこれらの行に対する更新操作はできません。- 途中で強制終了した場合でも、トランザクションがロールバックされるまで、ロックは保持されることになります。
- ロックの種類:
UPDATE文はレコードレベルの排他ロック(行レベルロック)を取得します。これはその行が他のトランザクションで更新されるのを防ぐためです。- 強制終了によってトランザクションが明示的に終了していない場合、このロックは解放されません。
実際に他のセッションから対象データに対してUPDATEできるか
- 基本原則:
- 強制終了によっても、対象のデータに対するロックが保持されている限り、他のセッションはそのロックが解放される(つまりトランザクションがコミットまたはロールバックされる)まで、更新操作を行うことはできません。
- 確認方法:
- セッションのロック状況を確認するには、以下のSQLクエリを使用できます。
sql SELECT l.session_id, l.locked_mode, o.object_name FROM v$locked_object l, dba_objects o WHERE l.object_id = o.object_id; - これは現在ロックが保持されているオブジェクトとそのセッションIDを表示します。
結論
確かに、UPDATE文を途中で強制終了し、COMMITやROLLBACKが行われない限り、その行はロックされたままになるため、他のセッションからの更新操作は行えません。トランザクションの状態をクリアするためには、適切にROLLBACKまたは同等の操作を実行する必要があります。

コメント