Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Database in Microsoft Fabric
Is een scalaire functie die de gebruikerstransactiestatus van een actueel lopend verzoek rapporteert. XACT_STATE geeft aan of het verzoek een actieve gebruikerstransactie heeft en of de transactie kan worden gecommit.
Transact-SQL syntaxis-conventies
Syntaxis
XACT_STATE()
Opmerking
Deze syntaxis wordt niet ondersteund door een serverloze SQL-pool in Azure Synapse Analytics.
Retourtype
smallint
Opmerkingen
XACT_STATE geeft de volgende waarden terug.
| Retourwaarde | Meaning |
|---|---|
| 1 | Het huidige verzoek heeft een actieve gebruikerstransactie. Het verzoek kan alle acties uitvoeren, waaronder het schrijven van gegevens en het committen van de transactie. |
| 0 | Er is geen actieve gebruikerstransactie voor het huidige verzoek. |
| -1 | Het huidige verzoek heeft een actieve gebruikerstransactie, maar er is een fout opgetreden waardoor de transactie als een niet-committable transactie is geclassificeerd. Het verzoek kan de transactie niet committen of terugrollen naar een savepoint; Het kan alleen een volledige terugrol van de transactie aanvragen. Het verzoek kan geen schrijfbewerkingen uitvoeren totdat het de transactie terugrolt. Het verzoek kan alleen leesbewerkingen uitvoeren totdat de transactie wordt teruggerold. Nadat de transactie is teruggerold, kan het verzoek zowel lees- als schrijfoperaties uitvoeren en kan een nieuwe transactie starten. Wanneer de buitenste batch is uitgevoerd, rolt de Database Engine automatisch alle actieve, niet-committable transacties terug. Als er geen foutmelding werd verzonden toen de transactie in een niet-committable toestand kwam, wordt er na afloop van de batch een foutmelding naar de clientapplicatie gestuurd. Dit bericht geeft aan dat een niet-committable transactie is gedetecteerd en teruggedraaid. |
Zowel de XACT_STATE- als de @@TRANCOUNT-functies kunnen worden gebruikt om te detecteren of het huidige verzoek een actieve gebruikerstransactie heeft. @@TRANCOUNT kan niet worden gebruikt om te bepalen of die transactie als een niet-committable transactie is geclassificeerd. XACT_STATE kan niet worden gebruikt om te bepalen of er geneste transacties zijn.
Voorbeelden
Het volgende voorbeeld gebruikt XACT_STATE in het CATCH blok van een TRY...CATCH construct om te bepalen of een transactie moet committen of teruggerold moet worden. Omdat SET XACT_ABORT is ON, zorgt de constraint-overtredingfout ervoor dat de transactie in een niet-committable toestand komt.
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
Zie ook
@@TRANCOUNT (Transact-SQL)
BEGIN TRANSACTIE (Transact-SQL)
DOORVOERTRANSACTIE (Transact-SQL)
TRANSACTIE voor terugdraaien (Transact-SQL)
TRANSACTIE OPSLAAN (Transact-SQL)
TRY... CATCH (Transact-SQL)