COMMIT TRANSACTION (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric のウェアハウス

正常終了した暗黙的または明示的なトランザクションの終点をマークします。 1 の場合 @@TRANCOUNTCOMMIT TRANSACTION トランザクションの開始以降のすべてのデータ変更をデータベースの永続的な部分にし、トランザクションのリソースを解放し、0 にデクリメント @@TRANCOUNT します。 1 より大きい場合 @@TRANCOUNT は、 COMMIT TRANSACTION 1 だけデクリメント @@TRANCOUNT され、トランザクションはアクティブなままです。

Transact-SQL 構文表記規則

構文

SQL Server および Azure SQL データベース の構文

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Microsoft Fabric、Azure Synapse Analytics、Parallel Data Warehouse データベースの Synapse Data Warehouse の構文。

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

transaction_name

適用対象: SQL Server および Azure SQL データベース

SQL Server データベース エンジンによって無視されます。 transaction_nameは、前BEGIN TRANSACTIONのトランザクションによって割り当てられたトランザクション名を指定します。 transaction_name は識別子の規則に従っている必要があります。ただし、32 文字を超えることはできません。 transaction_nameは、入れ子になったBEGIN TRANSACTIONCOMMIT TRANSACTIONプログラマが関連付けられているかを示します。

@tran_name_variable

適用対象: SQL Server および Azure SQL データベース

有効なトランザクション名を含むユーザー定義変数の名前。 変数は、char、varchar、nchar、または nvarchar データ型を使用して宣言する必要があります。 32 文字を超える文字が変数に渡される場合は、32 文字のみが使用されます。 再メイン文字は切り捨てられます。

WITH DELAYED_DURABILITY = { OFF |ON }

適用対象: SQL Server および Azure SQL データベース

このトランザクションを遅延持続性でコミットすることを要求するオプション。 データベースが変更された DELAYED_DURABILITY = DISABLED 場合、または DELAYED_DURABILITY = FORCED. 詳しくは、「トランザクションの持続性の制御」をご覧ください。

解説

トランザクションによって参照されるすべてのデータが論理的に正しい場合にのみ、Transact-SQL プログラマが発行 COMMIT TRANSACTION する必要があります。

コミットされたトランザクションが Transact-SQL 分散トランザクションの場合は、 COMMIT TRANSACTION MS DTC をトリガーして、2 フェーズ コミット プロトコルを使用して、トランザクションに関係するすべてのサーバーをコミットします。 データベース エンジンの同じインスタンス上にある 2 つ以上のデータベースがローカル トランザクションの対象となっている場合、インスタンスでは内部の 2 フェーズ コミットを使用して、トランザクションに参加しているすべてのデータベースをコミットします。

入れ子にされたトランザクションで使用する場合は、入れ子内のトランザクションをコミットしてもリソースは解放されず、修正も永久保存されません。 データ修正が永久保存され、リソースが解放されるのは、入れ子の外側のトランザクションをコミットした場合だけです。 1 より大きい場合@@TRANCOUNTに発行される各COMMIT TRANSACTION発行は、単に 1 ずつデクリメント@@TRANCOUNTされます。 最終的に 0 に減らされると @@TRANCOUNT 、外側のトランザクション全体がコミットされます。 transaction_nameはデータベース エンジンによって無視されるためCOMMIT TRANSACTION未処理の内部トランザクションがある場合に外部トランザクションの名前を参照する発行は、1 だけ減少@@TRANCOUNTします。

COMMIT TRANSACTION when が 0 の場合@@TRANCOUNTにエラーが発生します。対応するBEGIN TRANSACTIONエラーはありません。

データの変更がデータベースの永続的な COMMIT TRANSACTION 部分に加えられたため、ステートメントの発行後にトランザクションをロールバックすることはできません。

データベース エンジン では、ステートメントの開始時点でトランザクション数が 0 の場合にのみ、ステートメント内のトランザクション数が増加します。

アクセス許可

ロール public のメンバーシップが必要です。

この記事には AdventureWorks2022 サンプル データベースが必要です。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。

A. トランザクションをコミットする

適用対象: SQL Server、Azure SQL Database、Azure Synapse Analytics、および Analytics Platform System (PDW)

次の例では、ジョブ候補を削除します。

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;

B. 入れ子になったトランザクションをコミットする

適用対象: SQL Server および Azure SQL データベース

次の例では、テーブルを作成し、3 レベルの入れ子にされたトランザクションを生成してから、入れ子になったトランザクションをコミットします。 各 COMMIT TRANSACTION ステートメントには transaction_name パラメーターがありますが、COMMIT TRANSACTION ステートメントと BEGIN TRANSACTION ステートメントの間には関連はありません。 transaction_name パラメーターは、プログラマが @@TRANCOUNT を 0 まで減らすための正しいコミット数を指定できます。これにより、外側のトランザクションをコミットできます。

IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
    DROP TABLE TestTran;
GO

CREATE TABLE TestTran (
    Cola INT PRIMARY KEY,
    Colb CHAR(3)
);
GO

-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;

PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (1, 'aaa');

-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;

PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (2, 'bbb');

-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;

PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (3, 'ccc');

-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;

PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;

PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;

PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));