XACT_STATE (Transact-SQL)
Изменения: 14 апреля 2006 г.
Является скалярной функцией, которая сообщает о состоянии пользовательской транзакции текущего выполняемого запроса. Функция 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 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
См. также
Справочник
@@TRANCOUNT (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)
TRY...CATCH (Transact-SQL)
Другие ресурсы
Использование конструкции TRY...CATCH в языке Transact-SQL
Транзакции (компонент Database Engine)
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
14 апреля 2006 г. |
|