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


XACT_STATE (Transact-SQL)

Относится к:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsАналитическая платформа (PDW)SQL база данных в Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

XACT_STATE()

Примечание.

Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

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

smallint

Замечания

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

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

После завершения выполнения самого внешнего пакета ядро СУБД автоматически откатывает все активные неуправляемые транзакции. Если сообщение об ошибке не было отправлено, когда транзакция вошла в неуправляемое состояние, когда пакет завершится, сообщение об ошибке отправляется клиентскому приложению. Сообщение показывает, что обнаружены нефиксируемые транзакции и выполнен откат.

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

Примеры

Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

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

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

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block does not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- 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;