Поделиться через


XACT_STATE (Transact-SQL)

Является скалярной функцией, которая сообщает о состоянии пользовательской транзакции текущего выполняемого запроса. Функция XACT_STATE указывает, имеет ли запрос активную пользовательскую транзакцию и может ли она быть зафиксирована.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

XACT_STATE()

Тип возвращаемых данных

smallint

Замечания

XACT_STATE возвращает следующие значения.

Возвращаемое значение

Значение

1

Текущий запрос содержит активную пользовательскую транзакцию. Запрос может выполнять любые действия, включая запись данных и фиксирование транзакции.

0

У текущего запроса нет активной пользовательской транзакции.

-1

В текущем запросе есть активная транзакция, однако произошла ошибка, из-за которой транзакция классифицируется как нефиксируемая. Запросу не удается зафиксировать транзакцию или выполнить откат до точки сохранения; можно только запросить полный откат транзакции. Запрос не может выполнить никакие операции записи, пока не будет проведен откат транзакции. До отката транзакции запрос может выполнять только операции считывания. После отката транзакции запросу будут доступны как операции считывания, так и операции записи, а также запуск новых транзакций.

После завершения работы пакета компонент Database Engine автоматически выполнит откат любых активных нефиксируемых транзакций. Если при переходе транзакции в нефиксируемое состояние не было отправлено сообщение об ошибке, после завершения выполнения пакета сообщение об ошибке будет отправлено клиентскому приложению. Сообщение показывает, что обнаружены нефиксируемые транзакции и выполнен откат. Дополнительные сведения о нефиксируемых транзакциях см. в разделе Использование конструкции TRY...CATCH в языке Transact-SQL.

С помощью функций XACT_STATE и @@TRANCOUNT можно определять наличие активных транзакций в текущем запросе. Функция @@TRANCOUNT не может использоваться для определения фиксируемости транзакции. Функция XACT_STATE не может использоваться для определения наличия вложенных транзакций.

Примеры

В следующем примере выбор между фиксацией и откатом транзакции делается с помощью функции XACT_STATE в блоке CATCH конструкции TRY…CATCH. Поскольку функция SET XACT_ABORT принимает значение ON, транзакция становится нефиксируемой из-за нарушения ограничения.

USE AdventureWorks2008R2;
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