XACT_STATE (Transact-SQL)
這是報告目前正在執行之要求的使用者交易狀態的純量函數。XACT_STATE 指出要求是否具有使用中的使用者交易,以及是否可以認可該交易。
語法
XACT_STATE()
傳回類型
smallint
備註
XACT_STATE 會傳回下列值。
傳回值 |
意義 |
---|---|
1 |
目前的要求具有使用中的使用者交易。要求可以執行任何動作,其中包括寫入資料和認可交易。 |
0 |
目前的要求沒有任何使用中的使用者交易。 |
-1 |
目前的要求有一項使用中的使用者交易,但發生錯誤,使交易被分類為無法認可的交易。要求無法認可交易或回復到儲存點;它只能要求完整回復交易。要求無法執行任何寫入作業,直到它回復交易為止。要求只能執行讀取作業,直到它回復交易為止。在交易回復之後,要求便可以執行讀取和寫入作業,且可以起始一項新交易。 當批次完成執行時,Database Engine 會自動回復任何使用中無法認可的交易。如果在交易進入無法認可的狀態時沒有傳送任何錯誤訊息,則當批次完成時,就會將錯誤訊息傳送給用戶端應用程式。此訊息表示偵測到無法認可的交易,並已回復。如需有關無法認可之交易的詳細資訊,請參閱<在 Transact-SQL 中使用 TRY...CATCH>。 |
XACT_STATE 和 @@TRANCOUNT 函數都可用來偵測目前的要求是否有使用中的使用者交易。@@TRANCOUNT 無法用來判斷交易是否已分類為無法認可的交易。XACT_STATE 無法用來判斷是否有巢狀交易。
範例
下列範例會在 TRY…CATCH 建構之 CATCH 區塊中使用 XACT_STATE,來決定要認可或回復交易。由於 SET XACT_ABORT 是 ON,因此,條件約束違規錯誤會使交易進入無法認可的狀態。
USE AdventureWorks;
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