三流備忘録OracleのSQL PL/SQL 関数 ついての備忘録
ホーム >> PL/SQL備忘録 >> トランザクション処理

トランザクション処理

構文説明
COMMITトランザクション中のDML文で行ったすべての変更を
確定しトランザクションを終了する。
ROLLBACKトランザクション中のDML文で行ったすべての変更を
取消トランザクションを終了する。
SAVEPOINT セーブポイント名トランザクション内にセーブポイントを作成する
ROLLBACK TO SAVEPOINT セーブポイント名トランザクション内のセーブポイントまでロールバックする。

構文例1

DECLARE

BEGIN

	insert into tbl_hoge values (1);

	--コミット
	commit;

EXCEPTION;
	WHERE OTHERS THEN

		--エラーの場合ロールバック
		rollback;
END;

構文例2(文レベルのロールバック)

DECLARE

BEGIN

	insert into tbl_hoge values (1);

	セーブポイントの設定
	savepoint savepointname;

	insert into tbl_hoge values (2);

EXCEPTION;
	WHERE OTHERS THEN

		--エラーの場合ロールバック
		rollback to savepointname;
END;

暗黙的なロールバック

INSERT、UPDATE、DELETEを実行前に、Oracleは暗黙的なセーブポイントをマークする。
文の実行が失敗すると、Oracleはこのセーブポイントまでロールバックする。
通常は、トランザクション全体ではなく、失敗したSQL文のみロールバックする。

トランザクションの終了

明示的にコミットまたはロールバックが必要。
トランザクションを明示的にロールバックしなかった場合には、
クライアント環境に依存する。

【例:SQL*Plus環境】
データ定義文、データ制御文、COMMIT、EXIT、DISCONNECT、QUITが実行された場合COMMITする。
ROLLBACKの実行、セッションの中断の場合ROLLBACKする。

SELECT FOR UPDATE文

解説

表の特定の行を明示的にロックし、行を読み取った後に行が変更されないようにできる。
この間他のアプリケーションは行を変更できない。
オプションキーワードのNOWAITを指定するとOracleは待機しない。
NOWAITを省略するとOracleは行が利用できるまで待つ。
トランザクションをコミット、ロールバックすると行のロックは解除される。

構文例

DECLARE

	--排他ロック取得
	CURSOR C1 IS 
		SELECT *
		FROM   tbl_hoge
		WHERE  hoge_id = 10
		FOR UPDATE NOWAIT;

BEGIN

	--オープン時にロック取得
	OPEN C1;

	省略・・・・・

	--排他ロック開放
	CLOSE C1;

EXCEPTION
	WHEN OTHERS THEN
		RollBack;
		IF SQLCODE() = -54 THEN
       			DBMS_OUTPUT.PUT_LINE('排他エラー');
		ELSE
			DBMS_OUTPUT.PUT_LINE('その他のエラー');
		END IF;
END;