分享方式:


XACT_STATE (Transact-SQL)

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

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

Transact-SQL 語法慣例

Syntax

XACT_STATE()  

注意

Azure Synapse Analytics 的無伺服器 SQL 集區不支援此語法。

傳回類型

smallint

備註

XACT_STATE 會傳回下列值。

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

當最外層的批次完成執行之後,資料庫引擎將自動復原任何作用中無法認可的交易。 如果在交易進入無法認可的狀態時沒有傳送任何錯誤訊息,則當批次完成時,就會將錯誤訊息傳送給用戶端應用程式。 此訊息表示偵測到無法認可的交易,並已回復。

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

範例

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

USE AdventureWorks2022;  
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)