次の方法で共有


COMMIT TRANSACTION (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のハードウェア SQL データベース

正常終了した暗黙的または明示的なトランザクションの終点をマークします。 @@TRANCOUNTが 1 の場合、COMMIT TRANSACTIONは、トランザクションの開始以降のすべてのデータ変更をデータベースの永続的な部分にし、トランザクションのリソースを解放して、@@TRANCOUNTを 0 に減らします。 @@TRANCOUNTが 1 より大きい場合、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 ]
[ ; ]

引数

transaction_name

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

SQL Server データベース エンジンによって無視されます。 transaction_name は、前の BEGIN TRANSACTIONによって割り当てられたトランザクション名を指定します。 transaction_name は識別子の規則に従っている必要があります。ただし、32 文字を超えることはできません。 transaction_nameは、COMMIT TRANSACTIONが関連付けられている入れ子になったBEGIN 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で変更された場合、要求は無視されます。 詳しくは、「トランザクションの持続性の制御」をご覧ください。

解説

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

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

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

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

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

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

アクセス許可

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

この記事の Transact-SQL コード サンプルは AdventureWorks2022 または AdventureWorksDW2022 サンプル データベースを使用します。このサンプル データベースは、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));