Gestion fine des transactions imbriquées
Lorsque vous gérez des transactions, notamment des transaction imbriquées (nested transactions), le comportement de base est celui-ci:
- un COMMIT TRANSACTION valide la transaction la plus proche, et décrémente la variable @@TRANCOUNT
- un ROLLBACK TRANSACTION annule toutes les transactions, jusqu'à la plus externe, et remet @@TRANCOUNT à 0
SQL Server permet de nommer ses transactions, et donc de faire un COMMIT ou un ROLLBACK sur une transaction nommée. Toutefois, dans le cas des transactions imbriquées, le ROLLBACK doit nécessairement porter le nom de la transaction la plus externe. Si ce n'est pas le cas, une erreur vous est retournée. Donc, le nommage de transaction ne vous permet pas de faire le ROLLBACK d'une transaction imbriquée sans toucher les transactions externes.
De plus, le nommage des transactions imbriquées n'est pas vraiment utilisé. Le seul nom que SQL server conserve est celui de la transaction la plus externe. Les noms des transactions imbriquées sont purement et simplement ignorées. Cela devient plus un commentaire pour documenter son code qu'autre chose. Donc, un COMMIT TRANSACTION validera la transaction la plus proche, quel que soit le nom que vous lui donnez en paramètre. Exemple :
CREATE TABLE #test (id INT PRIMARY KEY) GO BEGIN TRANSACTION externe GO INSERT INTO #test VALUES (1) GO BEGIN TRANSACTION imbrique1 GO INSERT INTO #test VALUES (2) GO BEGIN TRANSACTION imbrique2 GO INSERT INTO #test VALUES (3) GO COMMIT TRANSACTION externe SELECT @@TRANCOUNT GO ROLLBACK TRANSACTION SELECT @@TRANCOUNT GO DROP TABLE #test GO
COMMIT TRANSACTION externe validera la transaction imbrique2, et la valeur de @@TRANCOUNT sera 2, rien d'autre.
Si vous voulez contrôler un ROLLBACK d'une partie d'une transaction, le mécanisme à votre disposition est celui des points d'enregistrement. En utilisant la commande SAVE TRANSACTION nom_du_point_d_enregistrement, puis plus loin ROLLBACK TRANSACTION nom_du_point_d_enregistrement, vous pouvez annuler une section de la transaction, sans affecter le reste. Ce ROLLBACK ne décrémente pas la valeur de @@TRANCOUNT.



