Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Database w Microsoft Fabric
Jest funkcją skalarną, która raportuje stan transakcji użytkownika aktualnie działającego żądania. XACT_STATE wskazuje, czy żądanie zawiera aktywną transakcję użytkownika oraz czy transakcja jest zdolna do zatwierdzenia.
Transact-SQL konwencje składni
Składnia
XACT_STATE()
Uwaga / Notatka
Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics.
Zwracany typ
smallint
Uwagi
XACT_STATE zwraca następujące wartości.
| Wartość zwracana | Meaning |
|---|---|
| 1 | Aktualne żądanie ma aktywną transakcję użytkownika. Żądanie może wykonać dowolne czynności, w tym zapisywać dane i zatwierdzać transakcję. |
| 0 | Nie ma aktywnej transakcji użytkownika dla bieżącego żądania. |
| -1 | Aktualne żądanie ma aktywną transakcję użytkownika, ale wystąpił błąd, który spowodował, że transakcja została sklasyfikowana jako transakcja niezatwierdzalna. Żądanie nie może zatwierdzać transakcji ani cofnąć się do punktu zapisu; Może jedynie zażądać pełnego cofnięcia transakcji. Żądanie nie może wykonać żadnych operacji zapisu, dopóki nie cofnie transakcji. Żądanie może wykonywać operacje odczytu tylko do momentu cofnięcia transakcji. Po cofnięciu transakcji żądanie może wykonywać zarówno operacje odczytu, jak i zapisu oraz rozpocząć nową transakcję. Gdy najbardziej zewnętrzna partia zakończy działanie, silnik bazy danych automatycznie cofnie wszystkie aktywne, niezatwierdzalne transakcje. Jeśli nie wysłano komunikatu o błędzie, gdy transakcja weszła w stan niezatwierdzalny, po zakończeniu partii zostanie wysłany komunikat o błędzie do aplikacji klienckiej. Ten komunikat wskazuje, że wykryto i cofnięto transakcję niezatwierdzalną. |
Zarówno funkcje XACT_STATE, jak i @@TRANCOUNT mogą być używane do wykrywania, czy aktualne żądanie zawiera aktywną transakcję użytkownika. @@TRANCOUNT nie może być użyte do ustalenia, czy transakcja została sklasyfikowana jako transakcja niezatwierdzalna. XACT_STATE nie może być użyte do określenia, czy istnieją transakcje zagnieżdżone.
Przykłady
Poniższy przykład wykorzystuje XACT_STATE w bloku CATCHTRY...CATCH konstrukcję do określenia, czy zatwierdzić, czy cofnąć transakcję. Ponieważ SET XACT_ABORT jest , ONbłąd naruszenia ograniczeń powoduje, że transakcja wchodzi w stan niezatwierdzalny.
USE AdventureWorks2022;
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
Zobacz też
@@TRANCOUNT (Transact-SQL)
ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)
TRANSAKCJA COMMIT (Transact-SQL)
WYCOFYWANIA TRANSAKCJI (Transact-SQL)
ZAPISZ TRANSAKCJĘ (Transact-SQL)
TRY... CATCH (Transact-SQL)