The Wayback Machine - http://web.archive.org/web/20140105203822/http://msdn.microsoft.com:80/zh-tw/library/ms189797(v=sql.90).aspx
匯出 (0) 列印
全部展開
Expand Minimize
本主題尚未接受評分 - 為這個主題評分

XACT_STATE (Transact-SQL)

更新: 2006 年 4 月 14 日

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

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


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

版本 歷程記錄

2006 年 4 月 14 日

新增內容:
  • 新增有關無法認可之交易的行為變更資訊。
變更的內容:
  • 釐清有關要求和交易的資訊。
本文對您有任何幫助嗎?
(剩餘 1500 個字元)

社群新增項目

新增
顯示:
© 2014 Microsoft. 著作權所有,並保留一切權利。