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 :

07/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[])
En outre, l'application comporte aussi du code comme celui-ci

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 ?