Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
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 zgłasza stan transakcji użytkownika bieżącej sesji.
XACT_STATE wskazuje, czy sesja ma aktywną transakcję użytkownika i czy transakcja jest w stanie zostać zatwierdzona.
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.
Typy zwracane
smallint
Uwagi
XACT_STATE Zwraca następujące wartości.
| Wartość zwracana | Description |
|---|---|
| 1 | Bieżąca sesja ma aktywną transakcję użytkownika. Sesja może wykonywać dowolne akcje, w tym zapisywanie danych i zatwierdzanie transakcji. |
| 0 | Brak aktywnej transakcji użytkownika dla bieżącej sesji. |
| -1 | Bieżąca sesja ma aktywną transakcję użytkownika, ale wystąpił błąd, który spowodował, że transakcja została sklasyfikowana jako transakcja nieuwierzytna. Sesja nie może zatwierdzić transakcji ani wycofać jej do punktu zapisu; może zażądać tylko pełnego wycofania transakcji. Sesja nie może wykonywać żadnych operacji zapisu, dopóki nie wycofa transakcji. Sesja może wykonywać tylko operacje odczytu, dopóki nie wycofa transakcji. Po wycofaniu transakcji sesja może wykonywać zarówno operacje odczytu, jak i zapisu i rozpocząć nową transakcję. Po zakończeniu działania najbardziej zewnętrznej partii aparat bazy danych automatycznie wycofa wszystkie aktywne niezatwierdzonych transakcji. Jeśli żaden komunikat o błędzie nie został wysłany, gdy transakcja została wprowadzona w stanie niezatwierdzonych, po zakończeniu wsadu do aplikacji klienckiej zostanie wysłany komunikat o błędzie. Ten komunikat wskazuje, że wykryto i cofnięto transakcję niezatwierdzalną. |
XACT_STATE Funkcje i @@TRANCOUNT mogą służyć do wykrywania, czy bieżąca sesja ma aktywną transakcję użytkownika.
@@TRANCOUNT Nie można użyć polecenia w celu określenia, czy ta transakcja jest klasyfikowana jako transakcja niezwiązana.
XACT_STATE Nie można użyć metody w celu określenia, czy istnieją transakcje wewnętrzne.
Przykłady
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
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.
-- 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;