COMMIT TRANSACTION (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のウェアハウス
正常終了した暗黙的または明示的なトランザクションの終点をマークします。 @@TRANCOUNT
が 1 の場合、COMMIT TRANSACTION
は、トランザクションの開始以降のすべてのデータ変更をデータベースの永続的な部分にし、トランザクションのリソースを解放して、@@TRANCOUNT
を 0 に減らします。 @@TRANCOUNT
が 1 より大きい場合、COMMIT TRANSACTION
は 1 だけ@@TRANCOUNT
デクリメントされ、トランザクションはアクティブなままです。
構文
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));