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.

 
sql_server/t-sql/transactions.txt · Dernière modification: 2006/08/04 13:07 (modification externe)