SQL DCL:トランザクション
トランザクションとは?
Trunsaction(取引)
複数のユーザーが同時にDBを操作する際にデータに不整合を発生させない為の機能。
一人のユーザーの処理を確定/取消できる。
Oracle
Commit/RollBackは必須。
Commit~Commit間が一つのトランザクション
トランザクションの開始~終了
~
# コミット
COMMIT;
# ロールバック
ROLLBACK;
~
ROLLBACK TRANSACTION/COMMIT TRANSACTION
–ここから–
~
–ここまで–
RollBack;/Commit;
読み取りの一貫性
セッション単位で一貫性が保持される。
プログラムを複数起動すると同一端末でも複数のセッションが発生する。
例1
・Aさんセッション
Select ~ (時間が掛かる場合:暗黙の行レベルロック)
・Bさんセッション
Update ~ ; Commit;
・Aさん
Select ~ (処理終了。Bさん処理は反映されない)
例2
・Aさんセッション
Commit;
Update ~ 表1 (1)
・Bさんセッション
Select ~ 表1
(1)の変更は取得できない。
・Aさんセッション
Commit;
・Bさんセッション
Select ~ 表1
(1)の変更を取得できる。
※AさんセッションがCommitされるまで自動的にロックされている。
変更も照会もできない。
明示的な行レベルロック
Select 列名 From 表名 For Update
Select 列名 From 表名 For Update Of 列名
列名を持つ表をロックする
Select 列名 From 表名 For Update NoWait
対象が既にロックされている場合:何もしない(解放を待機しない)
Select 列名 From 表名 For Update Wait n(秒)
対象が既にロックされている場合:n秒ロックを延長する(解放を待機する)。
Select時に行レベルロックを掛ける。
Select後、そのデータに対してUpdateを施す等の処理を行う場合に使用
明示的なロックの競合
A:Select ~ For Update されているレコードに対して、
別のトランザクションが
B:Select ~ For Update した場合
B:Select ~ For Update NOWAIT
排他エラー
B:Select ~ For Update
Aのロックが解除されるまで待ち続ける
B:Select ~ For Update WAIT 10
Aのロックが解除されるまで10秒間待つ。
10秒後、排他エラー
B:Select ~
排他エラー無し
セーブポイント(Oracle)
SavePoint セーブ名
※セーブポイント以降のトランザクションを取消
この処理を行ってもセーブポイントは残る。
RollBack To SavePoint セーブ名
Commit;
(1) Insert ~
(2) SavePoint A;
(3) Insert ~
(4) RollBack To SavePoint A; ※(3)の取消
(5) Insert ~
(6) Commit; (1)(5)の確定
(7) Insert ~
(8) RollBack; (7)の取消
セーブポイントを指定してのCommitはできない。
Commit/RollBack実行によってセーブポイントは削除される。
暗黙のCommit(Oracle)
(1)DDL文
テーブルの作成・定義等(Create/Alter/Truncate/Drop等)
(2)DCL文
権限設定、取消/確定処理等(Grant/Revoke/Commit/RollBack等)
※SavePoint除く
トランザクションの終了条件
・Commit/RollBackが発行される
・DDL文/DCL文の実行
※DCL文:SavePoint除く
・SQL Plus/SQL Developer等の操作ツールの終了
※終了時、Commitしていない処理はRollBackされる。
・マシン障害、システム障害発生時(RollBackされる)
排他制御
表ロック
共有ロック/排他ロック
LOCK TABLE (表名) IN SHARE MODE
LOCK TABLE (表名) IN EXCLUSIVE MODE
SELECTオプション
SELECT ~ WITH SHARE LOCK
SELECT ~ WITH EXCLUSIVE LOCK