Contrôle des transactions (Moteur de base de données)

Le contrôle des transactions par les applications consiste principalement à spécifier des points de début et de fin de chaque transaction. La spécification est effectuée à l'aide des instructions Transact-SQL ou des fonctions d'API de base de données. Le système doit aussi être capable de gérer les erreurs interrompant une transaction avant sa fin normale.

Par défaut, les transactions sont gérées au niveau de la connexion. Lorsqu'une transaction est démarrée lors d'une connexion, toutes les instructions Transact-SQL exécutées lors de cette connexion font partie de la transaction jusqu'à la fin de celle-ci. Toutefois, dans une session MARS (Multiple Active Result Set), une transaction Transact-SQL explicite ou implicite devient une transaction dont l'étendue est définie par traitement gérée au niveau du lot. À la fin du traitement, si une transaction dont l'étendue est définie par traitement n'est pas validée ou restaurée, elle est automatiquement restaurée par SQL Server.

Démarrage des transactions

À l'aide des fonctions API et des instructions Transact-SQL, vous pouvez démarrer des transactions en mode explicite, implicite ou validation automatique dans les instances du Moteur de base de données SQL Server. Dans une session MARS, les transactions Transact-SQL explicites et implicites deviennent des transaction dont l'étendue est définie par traitement.

  • Transactions explicites
    Démarrez explicitement une transaction par le biais d'une fonction API ou en émettant l'instruction Transact-SQL BEGIN TRANSACTION.

  • Transactions en mode autocommit
    Le mode par défaut du Moteur de base de données. Chaque instruction Transact-SQL est validée lorsqu'elle est terminée. Il est inutile de spécifier des instructions de contrôle des transactions.

  • Transactions implicites
    Activez le mode de transaction implicite en utilisant une fonction d'API ou l'instruction Transact-SQL SET IMPLICIT_TRANSACTIONS ON. L'instruction suivante démarre automatiquement une nouvelle transaction. Lorsque cette transaction est terminée, l'instruction Transact-SQL suivante démarre une nouvelle transaction.

  • Transaction dont l'étendue est définie par traitement
    Uniquement applicable aux ensembles de résultats MARS (Multiple Active Result Sets), une transaction Transact-SQL explicite ou implicite qui démarre sous une session MARS devient une transaction dont l'étendue est définie par traitement. Une transaction dont l'étendue est définie par traitement qui n'est pas validée ou restaurée à la fin du traitement est automatiquement restaurée par SQL Server.

Les modes de transaction sont gérés connexion par connexion. Le changement de mode de transaction sur une connexion n'affecte pas le mode de transaction des autres connexions.

Fin des transactions

Vous pouvez terminer les transactions avec une instruction COMMIT ou ROLLBACK, ou par le biais d'une fonction API.

  • COMMIT
    Si une transaction est réussie, validez-la. L'instruction COMMIT garantit que toutes les modifications effectuées sur la base de données au cours de la transaction sont permanentes. Cette instruction libère également les ressources, telles que les verrous, qui ont été utilisées par la transaction.

  • ROLLBACK
    Si une erreur se produit pendant une transaction ou si l'utilisateur décide de l'abandonner, restaurez-la. Une instruction ROLLBACK annule toutes les modifications effectuées par la transaction en rétablissant les données dans l'état où elles étaient avant le début de celle-ci. Cette instruction libère également les ressources bloquées par la transaction.

Notes

Dans le cas des connexions prenant en charge les ensembles de résultats MARS (Multiple Active Result Sets), une transaction explicite démarrée par le biais d'une fonction API ne peut pas être validée alors que des demandes sont en attente d'exécution. Toute tentative de validation d'une transaction de ce type entraîne une erreur si des opérations sont toujours en attente.

Spécification des limites d'une transaction

Vous pouvez spécifier le début et la fin des transactions du Moteur de base de données à l'aide des instructions Transact-SQL ou des fonctions et méthodes d'API.

  • Instructions Transact-SQL
    Utilisez les instructions BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK et SET IMPLICIT_TRANSACTIONS pour délimiter les transactions. Celles-ci sont généralement utilisées dans les applications de la bibliothèque DB-Library ainsi que dans les scripts Transact-SQL, comme ceux qui font appel à l'utilitaire de ligne de commande osql.

  • Fonctions et méthodes d'API
    Les API de bases de données comme ODBC, OLE DB, ADO et l'espace de noms SqlClient de .NET Framework comprennent des fonctions ou des méthodes qui permettent de délimiter les transactions. Celles-ci constituent les mécanismes de base utilisés pour contrôler les transactions dans une application du Moteur de base de données.

Chaque transaction ne peut être gérée que par une seule de ces méthodes. L'utilisation de deux méthodes différentes pour la même transaction peut produire des résultats indéfinis. Par exemple, vous ne pouvez pas démarrer une transaction en utilisant les fonctions d'API ODBC, puis la terminer en utilisant l'instruction Transact-SQL COMMIT. Dans ce cas, le pilote ODBC de SQL Server ne serait pas averti de la validation de la transaction. Vous devez par conséquent utiliser la fonction ODBC SQLEndTran pour terminer la transaction.

Erreurs de traitement au cours d'une transaction

Si une erreur entrave le bon déroulement d'une transaction, SQL Server la restaure automatiquement et libère toutes les ressources bloquées par la transaction. Si la connexion réseau du client à une instance du Moteur de base de données est interrompue, toutes les transactions en cours associées à cette connexion sont restaurées au moment de la notification de l'instance de l'interruption. En cas de défaillance de l'application cliente et de panne ou de redémarrage de l'ordinateur client, la connexion est interrompue. L'instance du Moteur de base de données restaure toutes les transactions en cours au moment de la notification de la panne par le réseau. Si le client se déconnecte de l'application, toutes les transactions en cours sont restaurées.

Si une instruction génère une erreur d'exécution (comme une violation de contrainte) dans un traitement, la réaction par défaut du Moteur de base de données est de restaurer seulement l'instruction ayant généré l'erreur. Vous pouvez modifier ce comportement à l'aide de l'instruction SET XACT_ABORT. Après l'exécution de SET XACT_ABORT ON, toute erreur d'exécution causée par une instruction déclenche automatiquement la restauration de la transaction en cours. Les erreurs de compilation, comme les erreurs de syntaxe, ne sont pas affectées par l'option SET XACT_ABORT. Pour plus d'informations, consultez SET XACT_ABORT (Transact-SQL).

Quand une erreur se produit, l'action corrective (COMMIT ou ROLLBACK) doit être incluse dans le code de l'application. Pour gérer efficacement les erreurs, notamment celles qui surviennent au cours de transactions, utilisez la construction TRY…CATCH dans Transact-SQL. Pour plus d'informations et d'exemples portant sur les transactions, consultez Utilisation de TRY...CATCH dans Transact-SQL et TRY...CATCH (Transact-SQL).