次の方法で共有


コミットトランザクション(Transact-SQL)

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

正常終了した暗黙的または明示的なトランザクションの終点をマークします。

@@TRANCOUNTが 1 の場合、COMMIT TRANSACTIONは、トランザクションの開始以降のすべてのデータ変更をデータベースの永続的な部分にし、トランザクション リソースを解放し、@@TRANCOUNTを 0 に減らします。

@@TRANCOUNTが 1 より大きい場合、COMMIT TRANSACTIONは 1 ずつ@@TRANCOUNTデクリメントされ、トランザクションはアクティブなままです。

Transact-SQL 構文表記規則

Syntax

Microsoft Fabric の SQL Server、Azure SQL Database、Azure SQL Managed Instance、SQL Database の構文。

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

Fabric Data Warehouse、Azure Synapse Analytics、Parallel Data Warehouse Database の構文。

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

適用対象: SQL Server 2008 (10.0.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース。

COMMITで指定されている場合、データベース エンジンによって無視されます。 transaction_name は、前の BEGIN TRANSACTIONによって割り当てられたトランザクション名を指定します。 transaction_name 識別子の規則に準拠している必要がありますが、32 文字を超えることはできません。 transaction_nameは、COMMIT TRANSACTION ステートメントが関連付けられている内部BEGIN TRANSACTIONステートメントを示すコード ドキュメント手法として使用できます。

@tran_name_variable

適用対象: SQL Server 2008 (10.0.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース。

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

WITH DELAYED_DURABILITY = { OFF |ON }

適用対象: SQL Server 2008 (10.0.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース。

このトランザクションを遅延持続性でコミットするように要求するオプション。 データベースの遅延持続性が無効になっている場合、要求は無視されます。 データベースに対して遅延持続性が強制される場合、このオプションに関係なく、トランザクションは遅延持続性でコミットされます。

詳しくは、「トランザクションの持続性の制御」をご覧ください。

Remarks

トランザクションによって参照されるすべてのデータが意図した一貫性の状態に達した時点で COMMIT TRANSACTION を発行するのは、アプリケーションの責任です。

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

内部トランザクションに使用すると、コミットによってリソースが解放されたり、データの変更が永続的に行われることはありません。 データ変更は永続的に行われ、外部トランザクションがコミットされた場合にのみリソースが解放されます。 各COMMIT TRANSACTION@@TRANCOUNTが 1 デクリメントを 1 より大きい場合に発行@@TRANCOUNTが、他の効果はありません。 @@TRANCOUNTが最終的に 0 に減らされると、外部トランザクション全体がコミットされます。 COMMIT TRANSACTIONで指定されたtransaction_nameはデータベース エンジンによって無視されるため、未処理の内部トランザクションがある場合に外部トランザクションの名前を参照するCOMMIT TRANSACTIONを発行すると、@@TRANCOUNT 1 だけ減少します。

@@TRANCOUNTが 0 の場合にCOMMIT TRANSACTIONを発行すると、対応するBEGIN TRANSACTIONがないため、エラーが発生します。

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

データベース エンジンは、個別に管理可能な入れ子になったトランザクションをサポートしていません。 内部トランザクションのコミットは @@TRANCOUNT デクリメントされますが、他の影響はありません。 セーブポイントが存在し、ROLLBACK ステートメントで指定されていない限り、内部トランザクションのロールバックは常に外部トランザクションをロールバックします。

Permissions

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

Examples

この記事のコード サンプルでは、AdventureWorks2025 または AdventureWorksDW2025 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

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

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

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

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

B. 外部トランザクションと内部トランザクションをコミットする

適用対象: Microsoft Fabric の SQL Server、Azure SQL Database、Azure SQL Managed Instance、SQL データベース。

次の例では、テーブルを作成し、外側のトランザクションと 2 つの内部トランザクションを開始してから、各トランザクションをコミットします。 この例で使用する 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));