Partage via


XACT_STATE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Base de données SQL dans Microsoft Fabric

Fonction scalaire qui signale l’état de transaction utilisateur de la session active. XACT_STATE indique si la session a une transaction utilisateur active et si la transaction est capable d’ê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.

Types de retour

smallint

Notes

XACT_STATE retourne les valeurs suivantes.

Valeur retournée Descriptif
1 La session active a une transaction utilisateur active. La session peut effectuer toutes les actions, notamment l’écriture de données et la validation de la transaction.
0 Il n’existe aucune transaction utilisateur active pour la session active.
-1 La session active a une transaction utilisateur active, mais une erreur s’est produite qui a provoqué la classification de la transaction comme une transaction noncommittable. La session ne peut pas valider la transaction ni revenir à un point d’enregistrement ; elle ne peut demander qu’une restauration complète de la transaction. La session ne peut effectuer aucune opération d’écriture tant qu’elle n’a pas rétabli la transaction. La session ne peut effectuer que des opérations de lecture jusqu’à ce qu’elle restaure la transaction. Une fois la transaction restaurée, la session peut effectuer des opérations de lecture et d’écriture et commencer une nouvelle transaction.

Lorsque le lot le plus externe se termine en cours d’exécution, le moteur de base de données restaure automatiquement toutes les transactions noncommittables actives. Si aucun message d’erreur n’a été envoyé lorsque la transaction a entré un état noncommittable, une fois le lot terminé, un message d’erreur est envoyé à l’application cliente. Ce message indique qu'une transaction non validable a été détectée et restaurée.

Les fonctions et @@TRANCOUNT les XACT_STATE fonctions peuvent être utilisées pour détecter si la session active a une transaction utilisateur active. @@TRANCOUNT ne peut pas être utilisé pour déterminer si cette transaction est classifiée comme une transaction noncommittable. XACT_STATE ne peut pas être utilisé pour déterminer s’il existe des transactions internes.

Exemples

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

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.

-- SET XACT_ABORT ON renders 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 generates a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block does not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- 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;