Linq To Sql - Question à propose des transactions scopes
Bonjour,
J'ai une question qui me turlupine à propos des transactions scopes. Alors j'ai le code suivant
Code:
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:
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 :
Citation:
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:
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 ?