共用方式為


XACT_STATE (Transact-SQL)

這是報告目前正在執行之要求的使用者交易狀態的純量函數。 XACT_STATE 指出要求是否具有使用中的使用者交易,以及是否可以認可該交易。

適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。

主題連結圖示 Transact-SQL 語法慣例

語法

XACT_STATE()

傳回類型

smallint

備註

XACT_STATE 會傳回下列值。

傳回值

意義

1

目前的要求具有使用中的使用者交易。 要求可以執行任何動作,其中包括寫入資料和認可交易。

0

目前的要求沒有任何使用中的使用者交易。

-1

目前的要求有一項使用中的使用者交易,但發生錯誤,使交易被分類為無法認可的交易。 要求無法認可交易或回復到儲存點;它只能要求完整回復交易。 要求無法執行任何寫入作業,直到它回復交易為止。 要求只能執行讀取作業,直到它回復交易為止。 在交易回復之後,要求便可以執行讀取和寫入作業,且可以起始一項新交易。

當批次完成執行時,Database Engine 會自動回復任何使用中無法認可的交易。 如果在交易進入無法認可的狀態時沒有傳送任何錯誤訊息,則當批次完成時,就會將錯誤訊息傳送給用戶端應用程式。 此訊息表示偵測到無法認可的交易,並已回復。

XACT_STATE 和 @@TRANCOUNT 函數都可用來偵測目前的要求是否有使用中的使用者交易。 @@TRANCOUNT 無法用來判斷交易是否已分類為無法認可的交易。 XACT_STATE 無法用來判斷是否有巢狀交易。

範例

下列範例會在 TRY…CATCH 建構之 CATCH 區塊中使用 XACT_STATE,來決定要認可或回復交易。 由於 SET XACT_ABORT 是 ON,因此,條件約束違規錯誤會使交易進入無法認可的狀態。

USE AdventureWorks2012;
GO

-- SET XACT_ABORT ON will render 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 will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block will not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Test XACT_STATE for 0, 1, or -1.
    -- If 1, the transaction is committable.
    -- If -1, the transaction is uncommittable and should 
    --     be rolled back.
    -- XACT_STATE = 0 means there is no transaction and
    --     a commit or rollback operation would generate an error.

    -- 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;
GO

請參閱

參考

@@TRANCOUNT (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)

TRY...CATCH (Transact-SQL)