Bonjour à tous,

J'aimerai avoir un comportement en utilisant deux transactions imbriquées mais c'est plutot complexe à mettre en oeuvre...

J'aimerai avoir deux transactions T1 et T2.
T1 execute un certain nombre de lectures ecritures.
En plein milieu de T1 (donc apres certaines lectures ecritures et avant certaines lectures ecritures), je dois ouvrir une seconde transaction.

Cette seconde transaction doit pouvoir faire son propre rollback sans pour autant influer sur tout ce qui a été fait avant.
La premiere transaction doit pouvoir rollbacker la totalité des operations réalisées (T1 + T2).

J'arrive à mettre en place un cas ou l'autre mais pas les deux en meme temps

Cas 1) où T1 est bien pris en compte mais T2 a été rollbacké (non commité)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Using trsc As New TransactionScope(TransactionScopeOption.Required, New TransactionOptions With {.IsolationLevel = IsolationLevel.ReadUncommitted})
                    advcontext.Tests.AddObject(New Tests With {.Numero = 111})
                    advcontext.SaveChanges()
                    Using trsc2 As New TransactionScope(TransactionScopeOption.RequiresNew)
                        advcontext.Tests.AddObject(New Tests With {.Numero = 222})
                        advcontext.SaveChanges()
                        'ICI PAS DE COMMIT
                    End Using
                    advcontext.Tests.AddObject(New Tests With {.Numero = 333})
                    advcontext.SaveChanges()
                    advcontext.Tests.AddObject(New Tests With {.Numero = 444})
                    advcontext.SaveChanges()
                    trsc.Complete()
                End Using

Cas 2) où T1 et T2 devraient être annulés

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Using trsc As New TransactionScope(TransactionScopeOption.Required, New TransactionOptions With {.IsolationLevel = IsolationLevel.ReadUncommitted})
                    advcontext.Tests.AddObject(New Tests With {.Numero = 111})
                    advcontext.SaveChanges()
                    Using trsc2 As New TransactionScope(TransactionScopeOption.Required)
                        advcontext.Tests.AddObject(New Tests With {.Numero = 222})
                        advcontext.SaveChanges()
                        trsc2.Complete()
                    End Using
                    advcontext.Tests.AddObject(New Tests With {.Numero = 333})
                    advcontext.SaveChanges()
                    advcontext.Tests.AddObject(New Tests With {.Numero = 444})
                    advcontext.SaveChanges()
                    'ICI PAS DE COMMIT : Ca annule le commit de T2
                End Using

Résumé des deux cas :
cas 1) T1 en required et T2 en requiresNew
cas 2) T1 en required et T2 en required

Finalement, si on prend les choses qui sont insérées dans le code de l'exemple je devrais avoir :

Un rollback général qui permet de tout annuler => aucun enregistrement de fait (on ne fait pas le commit de T1)
Un rollback sur T2 qui permet d'avoir 111,333,444 mais pas 222 (on ne fait pas le commit de T2)

J'espere que mon explication est assez claire, c'est pas évident à démontrer de façon lisible