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

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

権限

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

使用例

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

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

USE AdventureWorks2012;
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 AdventureWorks2012;
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

関連項目

参照

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)

@@TRANCOUNT (Transact-SQL)