トランザクション (Azure Synapse Analytics)

適用対象:Azure Synapse Analytics

トランザクションは、完全にコミットされた、または完全にロールバックされた 1 つ以上のデータベース ステートメントのグループです。 各トランザクションには、原子性、一貫性、分離性、持続性 (ACID) があります。 トランザクションが成功すると、その中のすべてのステートメントがコミットされます。 トランザクションが失敗した場合、つまりグループ内の少なくとも 1 つのステートメントが失敗した場合は、グループ全体がロールバックされます。

注意

SET AUTOCOMMIT コマンドは、Microsoft Fabric Data Warehouse ではサポートされていません。 Microsoft Fabric Data Warehouse のトランザクション、分離、コンカレンシー、整合性の詳細については、「Fabric Data Warehouse の トランザクション」を参照してください。

トランザクションの開始と終了は、 AUTOCOMMIT の設定と、 BEGIN TRANSACTION、 COMMIT、および ROLLBACK ステートメントによって異なります。

次の種類のトランザクションがサポートされています。

  • 明示的なトランザクションは 、 BEGIN TRANSACTION ステートメントで始まり、 COMMIT または ROLLBACK ステートメントで終わる。

  • トランザクションの自動コミットは セッション内で自動的に開始され、 BEGIN TRANSACTION ステートメントでは開始されません。

    • AUTOCOMMIT設定がONされると、各ステートメントはトランザクションで実行され、明示的なCOMMITやROLLBACKは必要ありません。
    • AUTOCOMMIT設定がOFFされている場合は、トランザクションの結果を判断するためにCOMMITまたはROLLBACKステートメントが必要です。 自動コミット トランザクションは、 COMMIT ステートメントまたは ROLLBACK ステートメントの直後、または SET AUTOCOMMIT OFF ステートメントの直後に開始されます。

Transact-SQL 構文表記規則

構文

BEGIN TRANSACTION [;]  
COMMIT [ TRAN | TRANSACTION | WORK ] [;]  
ROLLBACK [ TRAN | TRANSACTION | WORK ] [;]  
SET AUTOCOMMIT { ON | OFF } [;]  
SET IMPLICIT_TRANSACTIONS { ON | OFF } [;]  

引数

トランザクション開始

明示的トランザクションの開始点をマークします。

コミット [ 作業 ]

明示的なトランザクションまたはオートコミット トランザクションの終了をマークします。 このステートメントによって、トランザクション内の変更がデータベースに完全にコミットされます。 ステートメント COMMIT は、 COMMIT WORK、 COMMIT TRAN、および COMMIT TRANSACTIONと同じです。

ROLLBACK [ 作業 ]

トランザクションをトランザクションの先頭にロールバックします。 トランザクションに対する変更はデータベースにコミットされません。 ステートメント ROLLBACK は、 ROLLBACK WORK、 ROLLBACK TRAN、および ROLLBACK TRANSACTIONと同じです。

SET オートコミット { ON |停止}

トランザクションの開始方法と終了方法を決定します。

アクティブなトランザクション内で AUTOCOMMIT 設定を変更した場合、設定は現在のトランザクションに影響し、トランザクションが完了するまで有効になりません。

AUTOCOMMITがONされている場合、別のSET AUTOCOMMIT ON ステートメントを実行しても効果はありません。 同様に、 AUTOCOMMIT が OFFされている場合、別の SET AUTOCOMMIT OFF を実行しても効果はありません。

ON

各ステートメントは独自のトランザクションで実行され、明示的な COMMIT や ROLLBACK ステートメントは必要ありません。 明示的なトランザクションは、 AUTOCOMMIT が ONされている場合に許可されます。

OFF

トランザクションがまだ進行中でない場合、Azure Synapse Analytics によってトランザクションが自動的に開始されます。 後続のステートメントはトランザクションの一部として実行され、トランザクションの結果を判断するには COMMIT または ROLLBACK が必要です。 トランザクションがこの操作モードでコミットまたはロールバックされるとすぐに、モードは OFFのままになり、新しいトランザクションが開始されます。 AUTOCOMMITがOFFされている場合、明示的なトランザクションは許可されません。

SET IMPLICIT_TRANSACTIONS { オン |停止}

これにより、 SET AUTOCOMMITと同じモードが切り替わります。 ONすると、SET IMPLICIT_TRANSACTIONS接続が暗黙的なトランザクション モードに設定されます。 OFFすると、自動コミット モードへの接続が返されます。 詳細については、「 SET IMPLICIT_TRANSACTIONS (Transact-SQL)」を参照してください。

アクセス許可

トランザクション関連のステートメントを実行するために特別なアクセス許可は必要ありません。 トランザクション内でステートメントを実行するにはアクセス許可が必要です。

エラー処理

COMMITまたはROLLBACKが実行され、アクティブなトランザクションがない場合は、エラーが発生します。

トランザクションが既に進行中に BEGIN TRANSACTION が実行されると、エラーが発生します。 これは、BEGIN TRANSACTIONステートメントが成功した後、またはセッションがBEGIN TRANSACTION下にある場合に、SET AUTOCOMMIT OFFが発生した場合に発生する可能性があります。

実行時ステートメント エラー以外のエラーによって明示的なトランザクションの正常な完了が妨げられる場合、データベース エンジンはトランザクションを自動的にロールバックし、トランザクションによって保持されているすべてのリソースを解放します。 たとえば、クライアントのネットワーク接続が切断された場合や、クライアントがアプリケーションからサインアウトした場合、ネットワークが中断のインスタンスに通知すると、接続のコミットされていないトランザクションはすべてロールバックされます。

バッチで実行時ステートメント エラーが発生した場合、Azure Synapse Analytics は SQL Server XACT_ABORTON に設定された動作と一致し、トランザクション全体がロールバックされます。 XACT_ABORT設定の詳細については、SET XACT_ABORT(Transact-SQL)を参照してください。

注釈

セッションで実行できるトランザクション数は一度に 1 つのみです。セーブ ポイントと入れ子になったトランザクションはサポートされません。

トランザクションによって参照されるすべてのデータが論理的に正しい場合にのみ、プログラマが COMMIT を発行する必要があります。

トランザクションが完了する前にセッションが終了すると、トランザクションはロールバックされます。

トランザクション モードはセッション レベルで管理されます。 たとえば、あるセッションが明示的なトランザクションを開始したり、 AUTOCOMMIT を OFFに設定したり、 IMPLICIT_TRANSACTIONS を ONに設定したりした場合、他のセッションのトランザクション モードには影響しません。

制限事項

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

CREATE DATABASEおよびDROP DATABASE(Transact-SQL)コマンドは明示的なトランザクション内で使用できません。

Azure Synapse Analytics には、トランザクション共有メカニズムがありません。 これは、ある時点で、システム内のどのトランザクションでも、作業を実行できるのは 1 つのセッションのみであることを示します。

ロック動作

ロックによって、複数のユーザーが同時にアクセスしたときにトランザクションの整合性が保証され、データベースの一貫性が保たれます。 ロックは、暗黙的および明示的なトランザクションで使用されます。 各トランザクションでは、トランザクションが依存するテーブルやデータベースなど、リソースに対してさまざまな種類のロックが要求されます。

すべてのロックはテーブル レベル以上です。 ロックをかけると、ロックを要求したトランザクションにとって問題になるようなリソースの変更が行われないように、他のトランザクションがブロックされます。 各トランザクションでは、ロックされたリソースに依存関係がなくなると、ロックが解除されます。明示的なトランザクションでは、コミット時またはロールバック時にトランザクションが完了するまでロックが保持されます。

例示

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

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

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

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

CREATE TABLE ValueTable (id INT);  

BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

C. AUTOCOMMIT の設定

次の例では、 AUTOCOMMIT 設定を ON に設定します。

SET AUTOCOMMIT ON;  

次の例では、 AUTOCOMMIT 設定を OFF に設定します。

SET AUTOCOMMIT OFF;  

D. 暗黙的な複数ステートメント トランザクションを使用する

SET AUTOCOMMIT OFF;  

CREATE TABLE ValueTable (id INT);  
INSERT INTO ValueTable VALUES(1);  
INSERT INTO ValueTable VALUES(2);  

COMMIT;