Bonjour,
J'ai une question qui me turlupine à propos des transactions scopes. Alors j'ai le code suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted })) { using (var dematbase = DataContextFactory.CreateInvoicesDataContext()) { dematbase.CloseInvoice(Id); } HistoryManager.Add(...); scope.Complete(); }
La méthode Add de HistoryManager :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 internal static void Add(DocumentType documentType, long documentId, DocumentActions documentAction, CircuitItemTypes circuitItemType, string comment, CircuitItem circuitItem, Guid user) { using (var scope = new TransactionScope(TransactionScopeOption.Suppress, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { if (documentType == DocumentType.Invoice) { using (var db = DematDataContextFactory.CreateInvoicesDataContext()) { db.InvoiceHistory_Insert( documentId, user, (int)documentAction, (int)circuitItemType, comment, circuitItem == null ? (int?)null : circuitItem.ItemLevel, circuitItem == null ? (int?)null : circuitItem.ItemStep); } } else { using (var db = DematDataContextFactory.CreateStatusDataContext()) { db.StatusHistory_Insert(documentId, user, (int)documentAction, (int)circuitItemType, comment, circuitItem == null ? (int?)null : circuitItem.ItemLevel, circuitItem == null ? (int?)null : circuitItem.ItemStep); } } scope.Complete(); } }
Je voudrais savoir si vous connaissez le comportement du code si HistoryManager.Add() vient à échouer ? Est-ce que CloseInvoice() fait un rollback ?
Car depuis que nous utilisons du code de ce genre là nous avons des exceptions étranges que voici :
En outre, l'application comporte aussi du code comme celui-ci07/02/2013 12:23:06 - Error - Void ReceiveTransaction(UInt32, Byte[], IntPtr, System.Guid ByRef, System.Transactions.Oletx.OletxTransactionIsolationLevel ByRef, System.Transactions.Oletx.ITransactionShim ByRef) - 'VFAC201108183510' logged: Erreur lors de la mise en paiement : X5G66YO
Message : Communication with the underlying transaction manager has failed.
Source : System.Transactions
TargetSite :System.Transactions.Oletx.OletxTransaction GetOletxTransactionFromTransmitterPropigationToken(Byte[])
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 usig(Mycontext) { Mycontext.Doit(); HistoryManager.Add(); }
Il peut donc arriver que deux instances du context X soient imbriquées.
Avez-vous déjà eu ce cas ? Et vaut-il mieux démêller ce plat de spaghetti ?
Partager