Partager via


XACT_STATE (Transact-SQL)

Fonction scalaire qui indique l'état de la transaction utilisateur d'une demande en cours d'exécution. XACT_STATE indique s'il existe une transaction utilisateur active pour la demande en cours et si la transaction peut être validée.

Icône Lien de rubriqueConventions de la syntaxe Transact-SQL

Syntaxe

XACT_STATE()

Type de valeur renvoyée

smallint

Notes

La fonction XACT_STATE renvoie les valeurs suivantes :

Valeur renvoyée

Signification

1

Il existe une transaction utilisateur active pour la demande en cours. La demande peut exécuter toutes les actions, y compris l'écriture de données et la validation de la transaction.

0

Il n'existe aucune transaction utilisateur active pour la demande en cours.

-1

Il existe une transaction utilisateur active pour la demande en cours, mais une erreur a entraîné le classement de la transaction comme non validable. La demande ne peut pas valider la transaction ou revenir à un point d'enregistrement ; elle peut seulement demander une annulation complète de la transaction. La demande ne peut effectuer aucune opération d'écriture tant qu'elle n'a pas annulé la transaction. La demande peut effectuer uniquement des opérations de lecture tant qu'elle n'a pas annulé la transaction. Lorsque la transaction est annulée, la demande peut effectuer des opérations de lecture et d'écriture et commencer une nouvelle transaction.

À la fin de l'exécution d'un traitement, le moteur de base de données restaure automatiquement toutes les transactions non validables actives. Si aucun message d'erreur n'a été envoyé lorsque la transaction est passée dans un état non validable, une erreur est envoyée à l'application cliente lorsque le traitement se termine. Ce message indique qu'une transaction non validable a été détectée et restaurée. Pour plus d'informations sur les transactions non validables, consultez Utilisation de TRY...CATCH dans Transact-SQL.

Les fonctions XACT_STATE et @@TRANCOUNT permettent de détecter s'il existe une transaction utilisateur active pour la demande en cours. @@TRANCOUNT ne permet pas de déterminer si cette transaction a été classée comme transaction non validable. XACT_STATE ne permet pas de déterminer s'il existe des transactions imbriquées.

Exemple

L'exemple suivant utilise XACT_STATE dans le bloc CATCH d'une construction TRY…CATCH pour déterminer si une transaction doit être validée ou annulée. L'option SET XACT_ABORT étant active (ON), l'erreur de violation de contrainte place la transaction dans un état non validable.

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