次の方法で共有


XACT_STATE(Transact-SQL)

対象者:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsアナリティクスプラットフォームシステム(PDW)Microsoft FabricにおけるSQLデータベース

現在のセッションのユーザー トランザクションの状態を報告するスカラー関数です。 XACT_STATE は、セッションにアクティブなユーザー トランザクションがあるかどうか、およびトランザクションをコミットできるかどうかを示します。

Transact-SQL 構文表記規則

構文

XACT_STATE()

Note

この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

戻り値の型

smallint

注釈

XACT_STATE は次の値を返します。

戻り値 Description
1 現在のセッションにはアクティブなユーザー トランザクションがあります。 セッションは、データの書き込みやトランザクションのコミットなど、あらゆるアクションを実行できます。
0 現在のセッションに対するアクティブなユーザー トランザクションはありません。
-1 現在のセッションにはアクティブなユーザー トランザクションがありますが、トランザクションがコミット不可能なトランザクションとして分類される原因となったエラーが発生しました。 セッションでトランザクションをコミットしたり、セーブポイントにロールバックしたりすることはできません。トランザクションの完全なロールバックのみを要求できます。 セッションは、トランザクションをロールバックするまで書き込み操作を実行できません。 セッションは、トランザクションをロールバックするまで読み取り操作のみを実行できます。 トランザクションがロールバックされると、セッションは読み取り操作と書き込み操作の両方を実行でき、新しいトランザクションを開始できます。

最も外側のバッチの実行が完了すると、データベース エンジンはアクティブなコミット不可能なトランザクションを自動的にロールバックします。 トランザクションがコミットできない状態になったときにエラー メッセージが送信されなかった場合、バッチが完了すると、エラー メッセージがクライアント アプリケーションに送信されます。 このメッセージは、コミット不可能なトランザクションが検出され、ロールバックされたことを示します。

XACT_STATE関数と@@TRANCOUNT関数の両方を使用して、現在のセッションにアクティブなユーザー トランザクションがあるかどうかを検出できます。 @@TRANCOUNT は、そのトランザクションがコミット不可能なトランザクションとして分類されているかどうかを判断するために使用できません。 XACT_STATE は、内部トランザクションがあるかどうかを判断するために使用できません。

この記事のコード サンプルでは、AdventureWorks2025 または AdventureWorksDW2025 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

次の例では、XACT_STATE 構造の CATCH ブロックで TRY...CATCH を使用し、トランザクションをコミットまたはロールバックするかどうかを確認します。 ここでは SET XACT_ABORTON に設定されているため、制約違反エラーによってトランザクションはコミットできない状態になります。

-- SET XACT_ABORT ON renders the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This
        -- statement generates a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block does not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Test whether the transaction is uncommittable.
    IF XACT_STATE() = -1
    BEGIN  
        PRINT 'The transaction is in an uncommittable state.' +
              ' Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is active and valid.
    IF XACT_STATE() = 1
    BEGIN
        PRINT 'The transaction is committable.' +
              ' Committing transaction.'
        COMMIT TRANSACTION;
    END;
END CATCH;