2011-08-08 9 views
9

Creo que entiendo TransactionScopeOption.Suppress y TransactionScopeOption.Required pero estoy teniendo dificultades para entender lo que hace TransactionScopeOption.RequiresNew. Basado en la última explicación que leí, ¿los dos bloques de código siguientes serían funcionalmente iguales? ¿Es esta una representación fiel de lo que significa RequiresNew?Descripción de TransactionScopeOptions: RequiresNew = Suprimir + ¿Obligatorio?

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

y

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 
} 

Respuesta

11

para obtener una buena comprensión de la transacción Scopes se puede leer this msdn article

no puedo encontrar una buena explicación de cómo los dos sería diferente, excepto que el número de de ámbitos anidados que se crean son diferentes. Ambos casos deberían conducir a la misma cantidad de transacciones independientemente de si una transacción ya existe o no. No puedo encontrar un buen recurso para referirme, pero siempre iría por RequiresNew sobre un Suppress/Required combinado. RequiresNew significa básicamente: "independientemente de si ya hay o no una transacción, dame una nueva".

Actualización: En caso de que el primer enlace roto sigue siendo lo puede encontrar en el archivo wayback here

+0

ya lo hizo, eso es lo que me dio esa impresión. Citas: "' RequiresNew': el código contenido depende de una transacción, pero se debe comprometer o revertir de forma independiente. "Suprimir": el código contenido realiza su propia compensación, por lo que no debe formar parte de una transacción. " Esto significa (para mí) "comprometer" o "revertir" un RequiresNew TransactionScope no puede ser manipulado o dependiente de una transacción externa - ninguno afecta al otro. Eso es lo que debe hacer Suppress en su interior TransactionScope obligatorio. – Jaxidian

+0

Honestamente leí tu segundo bloque de código y pensé que tenías 2 workscopes anidados() (me perdí el Suppress en el externo). Editaré – Eddy

+2

Y solo para aclarar ... Si retrotrajo la transacción RequiresNew, eso de ninguna manera afecta a un TransactionScope padre, y del mismo modo, si restituyo un TransactionScope padre, eso de ninguna manera afecta la transacción RequiresNew? Lo siento, solo quiero asegurarme de que entiendo estas opciones por completo. ¡Muchos efectos secundarios potencialmente desagradables (punto muerto, operaciones no atómicas, etc.) si los mezclo! – Jaxidian