XACT_STATE (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Funzione scalare che segnala lo stato della transazione utente di una richiesta attualmente in esecuzione. XACT_STATE indica se la richiesta include una transazione utente attiva e se è possibile eseguire il commit di tale transazione.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

XACT_STATE()  

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Tipo restituito

smallint

Osservazioni:

XACT_STATE restituisce i valori seguenti.

Valore restituito Significato
1 La richiesta corrente include una transazione utente attiva. La richiesta può eseguire qualsiasi azione, tra cui la scrittura di dati e il commit della transazione.
0 La richiesta corrente non include una transazione utente attiva.
-1 La richiesta corrente include una transazione utente attiva, ma si è verificato un errore che ne ha causato la classificazione come transazione bloccata. La richiesta non può eseguire il commit della transazione né eseguirne il rollback fino a un punto di salvataggio. L'unica operazione consentita è la richiesta di un rollback completo della transazione. Finché non verrà eseguito il rollback della transazione, non sarà possibile eseguire operazioni di scrittura e saranno consentite solo operazioni di lettura. Dopo il rollback della transazione, la richiesta potrà eseguire operazioni sia di lettura che di scrittura e potrà avviare una nuova transazione.

Al termine dell'esecuzione del batch più esterno, il motore di database eseguirà automaticamente il rollback di tutte le transazioni attive di cui non è possibile eseguire il commit. Se non sono stati inviati messaggi di errore al momento dell'attivazione dello stato di blocco per la transazione, al termine dell'esecuzione del batch, verrà inviato un messaggio di errore all'applicazione client. Questo messaggio indica che è stata rilevata una transazione di cui non è possibile eseguire il commit e che ne è stato eseguito il rollback.

Sia le funzioni XACT_STATE che @@TRANCOUNT possono essere usate per rilevare se la richiesta corrente ha una transazione utente attiva. @@TRANCOUNT non può essere utilizzato per determinare se tale transazione è stata classificata come transazione non modificabile. Non è possibile utilizzare XACT_STATE per determinare se esistono transazioni nidificate.

Esempi

Nell'esempio seguente viene utilizzata la funzione XACT_STATE nel blocco CATCH di un costrutto TRY...CATCH per determinare se è necessario eseguire il commit o il rollback di una transazione. Poiché il valore di SET XACT_ABORT è ON, l'errore di violazione del vincolo attiva lo stato di blocco per la transazione.

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  

Vedi anche

@@TRANCOUNT (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)
TRY...CATCH (Transact-SQL)