すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_TRANSACTION

最終更新日:Oct 28, 2025

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; 文を実行して確認できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。

注意

  • SAVEPOINTROLLBACK_SAVEPOINT を使用する前に、polar_default_pl_stmt_transaction_rollback パラメーターを有効にしてください。

  • COMMIT または ROLLBACK は現在のトランザクションを終了します。続行するには、新しいトランザクションを開始する必要があります。

  • SAVEPOINT を頻繁に使用すると、トランザクションのオーバーヘッドが増加する可能性があります。トランザクションの粒度を慎重に計画してください。

  • BEGIN_WORKSET_TRANSACTION などの高度な機能はサポートされていません。

  • EXECUTE IMMEDIATE シナリオで COMMIT または ROLLBACK を使用するには、まず polar_enable_commit_in_execute_immediate パラメーターを有効にする必要があります。

SAVEPOINT

トランザクションにセーブポイントを設定します。後でこのポイントにロールバックできます。

構文

DBMS_TRANSACTION.SAVEPOINT(savepoint_name VARCHAR2);

パラメーター

パラメーター

説明

savepoint_name

セーブポイントの名前。

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;
説明
  1. トランザクションが開始された後、エントリが挿入され、セーブポイント `sp1` がマークされます。

  2. 後続の操作が失敗した場合、ROLLBACK_SAVEPOINT を使用して `sp1` にロールバックできます。

  3. 最後に、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;
説明
  1. トランザクションが開始された後、'Alice' のデータが挿入され、セーブポイント `sp1` がマークされます。

  2. 'Bob' のデータが挿入されますが、その後 ROLLBACK_SAVEPOINT('sp1') を使用して挿入がロールバックされます。'Bob' のレコードは保存されません。

  3. 最後に、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;
説明
  1. トランザクションが開始された後、2 つのレコードが挿入されます。

  2. COMMIT 文が呼び出されてトランザクションがコミットされます。すべての変更はデータベースに永続的に書き込まれます。

  3. トランザクションを明示的にコミットしない場合、プログラムブロックが終了すると自動的にコミットされます。この動作はデータベースの構成によって異なります。

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;
説明
  1. トランザクションが開始され、'Alice' のデータが挿入された後、手動でエラーがトリガーされます。

  2. EXCEPTION ハンドラで、ROLLBACK() が呼び出され、コミットされていないすべての変更が取り消されます。

  3. トランザクションはロールバックされます。`test_table` に新しいレコードは追加されません。