COMMIT TRANSACTION (Transact-SQL)

正常終了した暗黙的または明示的なトランザクションの終点をマークします。@@TRANCOUNT が 1 の場合、COMMIT TRANSACTION はトランザクションの開始以降加えられたすべてのデータ修正をデータベースに永久保存し、そのトランザクションによって保持されているリソースを解放してから @@TRANCOUNT を 0 に減らします。@@TRANCOUNT が 1 より大きい場合、COMMIT TRANSACTION は @@TRANCOUNT を 1 だけ減らし、トランザクションをアクティブに保ちます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]

引数

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

  • @tran\_name\_variable
    有効なトランザクション名を格納しているユーザー定義変数の名前を指定します。この変数は、char 型、varchar 型、nchar 型、または nvarchar 型で宣言する必要があります。変数に 32 文字を超える文字が渡された場合は、32 文字だけが使用され、残りの文字は切り捨てられます。

説明

Transact-SQL のプログラマは、トランザクションで参照されるすべてのデータが論理的に正しいことを確認したうえで COMMIT TRANSACTION を実行する必要があります。

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

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

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

COMMIT TRANSACTION ステートメントの実行後は、データ修正がデータベースに永久保存されるので、トランザクションをロールバックすることはできません。

SQL Server 2000 以降のデータベース エンジンでは、ステートメントの開始時点でトランザクション数が 0 の場合にのみ、ステートメント内のトランザクション数が増加します。SQL Server バージョン 7.0 では、トランザクション数は、ステートメントの開始時点でのトランザクション数に関係なく常に増加します。このため、トリガ内の @@TRANCOUNT によって返される値は、SQL Server バージョン 7.0 よりも SQL Server 2000 以降の方が低い値になる可能性があります。

SQL Server 2000 以降では、COMMIT TRANSACTION または COMMIT WORK ステートメントがトリガ内で実行される場合、トリガの開始時に、対応する明示的または暗黙的な BEGIN TRANSACTION ステートメントがないと、SQL Server バージョン 7.0 とは異なる動作が実行される場合があります。COMMIT TRANSACTION または COMMIT WORK ステートメントをトリガ内に配置することは推奨されません。

権限

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

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

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

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

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

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

USE AdventureWorks;
GO
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;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO