トランザクション開始(Transact-SQL)

対象者:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft FabricのWarehouseMicrosoft FabricにおけるSQLデータベース

明示的なローカル トランザクションの開始位置をマークします。 明示的なトランザクションは、 BEGIN TRANSACTION ステートメントで始まり、 COMMIT または ROLLBACK ステートメントで終わる。

Transact-SQL 構文表記規則

Syntax

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

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Fabric Data WarehouseとAzure Synapse Analyticsの構文論。

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

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

トランザクションに割り当てられた名前。 transaction_name 識別子の規則に準拠する必要がありますが、32 文字を超える識別子は許可されません。 トランザクション名は、 BEGIN...COMMIT ステートメントまたは BEGIN...ROLLBACK ステートメントの最も外側のペアでのみ使用します。 データベース エンジン インスタンスで大文字と小文字が区別されない場合でも、transaction_nameでは常に大文字と小文字が区別されます。

@tran_name_variable

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

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

マークと共に [ 「説明」 ]

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

トランザクションがトランザクション ログにマークされていることを指定します。 description は、マーク名を示す文字列です。 指定 128 文字を超える文字は、msdb.dbo.logmarkhistory テーブルに格納される前に 128 文字に切り捨てられます。

WITH MARKを使用する場合は、トランザクション名を指定する必要があります。 WITH MARK では、マークで識別されたポイントにトランザクション ログを復元できます。

Remarks

BEGIN TRANSACTION@@TRANCOUNT1インクリメントします。

BEGIN TRANSACTION は、セッションによって参照されるデータが一貫性のある特定の状態であるポイントを表します。 BEGIN TRANSACTION後に行われたすべてのデータ変更をロールバックして、この既知の整合性状態にデータを返すことができます。 各トランザクションは、変更をデータベースの永続的な部分にするために COMMIT TRANSACTION が発行されるまで、またはすべての変更が ROLLBACK TRANSACTION ステートメントで消去されるまで続きます。

トランザクション中止エラーが発生した場合、または実行時エラーが発生し、 XACT_ABORT セッション オプションが ONに設定されている場合、トランザクションは自動的にロールバックできます。 詳細については、SET XACT_ABORTを参照してください。

BEGIN TRANSACTION は、ステートメントを発行するセッションのローカル トランザクションを開始します。 現在のトランザクション分離レベルの設定に応じて、セッションによって発行された Transact-SQL ステートメントをサポートするために取得されたリソースは、 COMMIT TRANSACTION または ROLLBACK TRANSACTION ステートメントで完了するまでトランザクションによってロックされます。 トランザクションが長期間未処理のままの場合、他のセッションがこれらのロックされたリソースにアクセスできなくなる可能性があります。また、トランザクション ログの切り捨てやバージョン ストアのクリーンアップを防ぐこともできます。

BEGIN TRANSACTIONはローカル トランザクションを開始しますが、アプリケーションがログに記録する必要があるアクション (INSERTUPDATEDELETE ステートメントの実行など) を実行するまで、トランザクション ログに記録されません。 トランザクションが開始されると、データベース エンジンは、 SELECT ステートメントのトランザクション分離レベルを保護するためのロックの取得などのアクションを実行できますが、アプリケーションが変更アクションを実行するまで、トランザクション ログには何も記録されません。

BEGIN TRANSACTIONを発行した後、BEGIN TRANSACTIONをもう一度発行して、1 つ以上の内部トランザクションを開始できます。 内部トランザクション のtransaction_name を指定できますが、最初の (最も外側の) トランザクション名のみがシステムに登録されます。 他の名前 (有効なセーブポイント名以外) にロールバックすると、ステートメントをロールバックせずにエラーが生成されます。 ステートメントは、外側のトランザクションがロールバックされた場合にのみロールバックされます。

ステートメントがコミットまたはロールバックされる前に次のアクションが実行された場合、 BEGIN TRANSACTION ステートメントによって開始されたローカル トランザクションは分散トランザクションに昇格されます。

  • リンク サーバー上のリモート テーブルを参照する INSERTDELETE、または UPDATE ステートメントが実行されます。 リンク サーバーへのアクセスに使用する OLE DB プロバイダーがINSERT インターフェイスをサポートしていない場合、UPDATEDELETE、またはITransactionJoinステートメントは失敗します。

  • REMOTE_PROC_TRANSACTIONS オプションが ON に設定されている場合、リモート ストアド プロシージャの呼び出しが行われます。

ローカル データベース エンジン インスタンスがトランザクション コントローラーになり、Microsoft 分散トランザクション コーディネーター (MS DTC) を使用して分散トランザクションを管理します。

トランザクションは、 BEGIN DISTRIBUTED TRANSACTIONを使用して分散トランザクションとして明示的に実行できます。 詳細については、「 BEGIN DISTRIBUTED TRANSACTION」を参照してください。

SET IMPLICIT_TRANSACTIONSON に設定されている場合、BEGIN TRANSACTION ステートメントは外部トランザクションと内部トランザクションを作成し、@@TRANCOUNTを 2 に設定します。 詳細については、SET IMPLICIT_TRANSACTIONSを参照してください。

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

マークされたトランザクション

WITH MARK オプションを指定すると、トランザクション名がトランザクション ログに記録されます。 データベースを以前の状態に復元する場合、マークされたトランザクションを使用して、日付と時刻ではなく復元ポイントを指定できます。 詳細については、「Marked Transactionsを使って関連データベースを一貫して回復する」および「文RESTORE」をご覧ください。

さらに、関連するデータベースのセットを一定の一貫性の共有状態に回復する必要がある場合は、トランザクション ログ マークが必要です。 すべてのデータベースの整合性状態を認識しているアプリケーションは、複数のデータベースまたは分散トランザクションを使用して、関連するデータベースのトランザクション ログにマークを配置できます。 これらのマークに関連するデータベースのセットを復旧すると、一貫性の共有状態が既知のデータベースセットになります。

トランザクション ログにマークが設定されるのは、マーク付きのトランザクションによってデータベースが更新される場合のみです。 データを変更しないトランザクションはログに記録されません。

BEGIN TRANSACTION <new_name> WITH MARK は、内部トランザクションの開始時に使用できます。 その場合、外部トランザクションがマークされていない場合、 <new_name> はトランザクションのマーク名になります。 次の概念例では、 M2 はマークの名前です。

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;

UPDATE table2 ...;

SELECT column1 FROM table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

内部トランザクションをマークすると、既にマークされているトランザクションをマークしようとすると、次の警告メッセージが表示されます。

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

Permissions

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

Examples

この記事のコードサンプルは、Azure Data SQL Samples Repository GitHub repositoryからダウンロードできるAdventureWorks2025またはAdventureWorksDW2025サンプルデータベースを使用しています。

A. 明示的なトランザクションを使用する

対象:SQL Server 2008(10.0.x)以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft FabricのSQL Database、およびAzure Synapse Analytics

BEGIN TRANSACTION;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION;

B. トランザクションをロールバックする

対象:SQL Server 2008(10.0.x)以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft FabricのSQL Database、およびAzure Synapse Analytics

次の例では、トランザクションのロールバックの効果を示します。 この例では、 ROLLBACK ステートメントは INSERT ステートメントをロールバックしますが、作成されたテーブルは引き続き存在します。

CREATE TABLE ValueTable
(
    id INT
);

BEGIN TRANSACTION;

INSERT INTO ValueTable VALUES (1);
INSERT INTO ValueTable VALUES (2);

ROLLBACK;

C. トランザクションに名前を付けます

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

次の例では、トランザクションの名前を指定する方法を示します。

DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;

D. トランザクションをマークする

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

次の例では、トランザクションにマークを付ける方法を示します。 トランザクション CandidateDelete にマークが付けられています。

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION CandidateDelete;