2011-08-08 12 views
9

Uważam, że rozumiem TransactionScopeOption.Suppress i TransactionScopeOption.Required, ale mam trudności ze zrozumieniem, co robi TransactionScopeOption.RequiresNew. W oparciu o ostatnie wyjaśnienie, które przeczytałem, czy następujące dwa bloki kodu funkcjonalnie będą takie same? Czy to jest dokładna reprezentacja tego, co oznacza RequiresNew?Understanding TransactionScopeOptions: RequewNew = Suppress + Required?

using (var ts1 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    DoStuff(); 
    ts1.Complete(); 
} 

i

using (var ts2 = new TransactionScope(TransactionScopeOptions.Suppress)) 
{ 
    using (var ts3 = new TransactionScope()) 
    { 
    DoStuff(); 
    ts3.Complete(); 
    } 

    ts2.Complete(); // not required but recommended for consistency's sake 
} 

Odpowiedz

11

Aby uzyskać dobre zrozumienie transakcji zakresów można przeczytać this msdn article

nie mogę znaleźć dobre wyjaśnienie w jaki sposób te dwa byłby inny oprócz tego, że liczby Zagnieżdżone zakresy, które są tworzone, są różne. Oba przypadki powinny prowadzić do takiej samej liczby transakcji, niezależnie od tego, czy transakcja już istnieje. Nie mogę znaleźć dobrego zasobu, do którego można się odnieść, ale zawsze wybieram RequiredNew w połączeniu z Suppress/Required. RequestsNew zasadniczo oznacza: "niezależnie od tego, czy transakcja już istnieje, czy nie, daj mi nową".

Aktualizacja: W przypadku pierwszym ogniwem pozostaje uszkodzony można go znaleźć w archiwum Wayback here

+0

już to zrobił, to co dał mi to wrażenie. Cytaty: "' RequewNew': zamknięty kod zależy od transakcji, ale musi być niezależnie zatwierdzony lub wycofany. "Suppress": zamknięty kod wykonuje własne wynagrodzenie, więc nie może być częścią transakcji. " To oznacza (dla mnie) "popełnienie" lub "cofnięcie". PolecenieNowe TransactionScope nie może być manipulowane lub zależne od transakcji zewnętrznej - żadna z nich nie wpływa na drugą. To właśnie powinno wykonać zadanie SuppressScope. – Jaxidian

+0

Szczerze mówiąc, źle odczytałem twój drugi blok kodu i myślałem, że masz 2 zagnieżdżone transakcje() (pominięte w Suppress na zewnętrznym). Będę edytować – Eddy

+2

I tylko wyjaśnić ... Jeśli wycofam transakcję RequiredNew, która w żaden sposób nie wpływa na nadrzędną transakcję TransactionScope, i podobnie, jeśli wycofam nadrzędną transakcję TransactionScope, to w żaden sposób nie wpływa ona na transakcję RequiredNew? Przepraszam, chcę tylko upewnić się, że rozumiem te opcje w pełni. Wiele potencjalnie nieprzyjemnych efektów ubocznych (zakleszczenie, operacje nie-atomowe, itp.), Jeśli je pomieszam! – Jaxidian

Powiązane problemy