Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Относится к:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure 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;