XACT_STATE (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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.

Conventions de la syntaxe Transact-SQL

Syntaxe

XACT_STATE()  

Notes

Cette syntaxe n’est pas prise en charge par le pool SQL serverless dans Azure Synapse Analytics.

Type de retour

smallint

Notes

La fonction XACT_STATE renvoie les valeurs suivantes :

Valeur retourné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 du lot extérieur, 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.

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.

Exemples

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 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  

Voir aussi

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