DBMS_TRANSACTION は、Oracle 構文と互換性のある組み込みパッケージです。このパッケージは、ストアドプロシージャや関数などの PL/SQL プログラムブロック内のトランザクションを詳細に制御する機能を提供します。セーブポイント機能は柔軟なトランザクション管理を提供し、トランザクション全体をロールバックする代わりに、トランザクションの一部を取り消すことができます。
特徴
PolarDB for PostgreSQL (Oracle 互換) は、次の 4 つの関数をサポートしています:
SAVEPOINT: トランザクションにセーブポイントをマークします。後でこのセーブポイントにロールバックできます。ROLLBACK_SAVEPOINT: トランザクションを指定されたセーブポイントにロールバックします。これにより、セーブポイントが設定された後に行われた操作が取り消されます。COMMIT: 現在のトランザクションをコミットします。これにより、すべてのデータ変更が永続化されます。ROLLBACK: トランザクション全体をロールバックします。これにより、コミットされていないすべての操作が取り消されます。
前提条件
この機能は、マイナーエンジンバージョンが 2.0.14.17.34.0 以降の Oracle 構文互換 2.0 でのみサポートされています。
マイナーエンジンバージョンは [コンソール] で表示するか、SHOW polardb_version; 文を実行して確認できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
注意
SAVEPOINTとROLLBACK_SAVEPOINTを使用する前に、polar_default_pl_stmt_transaction_rollbackパラメーターを有効にしてください。COMMITまたはROLLBACKは現在のトランザクションを終了します。続行するには、新しいトランザクションを開始する必要があります。SAVEPOINTを頻繁に使用すると、トランザクションのオーバーヘッドが増加する可能性があります。トランザクションの粒度を慎重に計画してください。BEGIN_WORKやSET_TRANSACTIONなどの高度な機能はサポートされていません。EXECUTE IMMEDIATEシナリオでCOMMITまたはROLLBACKを使用するには、まずpolar_enable_commit_in_execute_immediateパラメーターを有効にする必要があります。
SAVEPOINT
トランザクションにセーブポイントを設定します。後でこのポイントにロールバックできます。
構文
DBMS_TRANSACTION.SAVEPOINT(savepoint_name VARCHAR2);パラメーター
パラメーター | 説明 |
| セーブポイントの名前。 |
例
DECLARE
BEGIN
-- テストデータを挿入
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
-- セーブポイントを設定
DBMS_TRANSACTION.SAVEPOINT('sp1');
-- 失敗する可能性のある操作を実行
INSERT INTO test_table (id, name) VALUES (2, 'Bob');
-- トランザクションをコミット
COMMIT;
END;トランザクションが開始された後、エントリが挿入され、セーブポイント `sp1` がマークされます。
後続の操作が失敗した場合、
ROLLBACK_SAVEPOINTを使用して `sp1` にロールバックできます。最後に、
COMMIT文がトランザクションをコミットし、すべての変更が有効になります。
ROLLBACK_SAVEPOINT
トランザクションを指定されたセーブポイントにロールバックします。これにより、セーブポイントが設定された後に行われた操作が取り消されます。
構文
DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(savepoint_name VARCHAR2);パラメーター
パラメーター | 説明 |
savepoint_name | セーブポイントの名前。 |
例
DECLARE
BEGIN
-- 最初のレコードを挿入
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
-- セーブポイントを設定
DBMS_TRANSACTION.SAVEPOINT('sp1');
-- 2 番目のレコードを挿入 (これは失敗する可能性があります)
INSERT INTO test_table (id, name) VALUES (2, 'Bob');
-- セーブポイント sp1 にロールバック
DBMS_TRANSACTION.ROLLBACK_SAVEPOINT('sp1');
-- トランザクションをコミット
COMMIT;
END;トランザクションが開始された後、'Alice' のデータが挿入され、セーブポイント `sp1` がマークされます。
'Bob' のデータが挿入されますが、その後
ROLLBACK_SAVEPOINT('sp1')を使用して挿入がロールバックされます。'Bob' のレコードは保存されません。最後に、
COMMIT文がトランザクションをコミットします。挿入された 'Alice' のデータのみが保持されます。
COMMIT
現在のトランザクションをコミットして、すべての変更を永続化します。
構文
DBMS_TRANSACTION.COMMIT();例
DECLARE
BEGIN
-- 2 つのレコードを挿入
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
INSERT INTO test_table (id, name) VALUES (2, 'Bob');
-- トランザクションをコミット
DBMS_TRANSACTION.COMMIT();
END;トランザクションが開始された後、2 つのレコードが挿入されます。
COMMIT 文が呼び出されてトランザクションがコミットされます。すべての変更はデータベースに永続的に書き込まれます。
トランザクションを明示的にコミットしない場合、プログラムブロックが終了すると自動的にコミットされます。この動作はデータベースの構成によって異なります。
ROLLBACK
トランザクション全体をロールバックします。これにより、コミットされていないすべての変更が取り消されます。
構文
DBMS_TRANSACTION.ROLLBACK();例
DECLARE
BEGIN
-- 最初のレコードを挿入
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
-- エラーをシミュレート
IF 1 = 1 THEN
RAISE_APPLICATION_ERROR(-20001, 'Manually triggered error');
END IF;
-- トランザクションをコミット (実行されません)
DBMS_TRANSACTION.COMMIT();
EXCEPTION
WHEN OTHERS THEN
-- トランザクション全体をロールバック
DBMS_TRANSACTION.ROLLBACK();
DBMS_OUTPUT.PUT_LINE('Transaction has been rolled back');
END;トランザクションが開始され、'Alice' のデータが挿入された後、手動でエラーがトリガーされます。
EXCEPTIONハンドラで、ROLLBACK()が呼び出され、コミットされていないすべての変更が取り消されます。トランザクションはロールバックされます。`test_table` に新しいレコードは追加されません。