Condividi tramite


XACT_STATE (Transact-SQL)

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.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

XACT_STATE()

Tipo restituito

smallint

Osservazioni

XACT_STATE restituisce i valori seguenti.

Valore restituito

Descrizione

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 di un batch, 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. Per ulteriori informazioni sulle transazioni bloccate, vedere Utilizzo di TRY...CATCH in Transact-SQL.

Per verificare se la richiesta corrente include una transazione utente attiva, è possibile utilizzare entrambe le funzioni XACT_STATE e @@TRANCOUNT. Non è possibile utilizzare @@TRANCOUNT per determinare se la transazione è stata classificata come transazione di cui non è possibile eseguire il commit. 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 AdventureWorks;
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