2010-12-21 10 views

Respuesta

20

Dado que están anidados, la transacción interna se retrotraerá.

Esta no es toda la historia, y depende de cómo se crea la transacción anidada, pero de forma predeterminada, se retrotraerá.

This article entra en profundidad sobre TransactionScope y debería responder la mayoría de sus preguntas.


Ser distribuido o no es irrelevante.

+0

@Frantisek hizo mención de las transacciones distribuidas. ¿Cómo sé que estoy usando una transacción distribuida? – Tebo

+0

Supongo que estaba equivocado. Con TransactionScope, probablemente no necesite dtc para que funcione. Lea esto http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx: "Aunque un ámbito anidado se puede unir a la transacción ambiental del ámbito raíz, llamando a Complete en el ámbito anidado no tiene efecto en el alcance de la raíz. Solo si todos los alcances del alcance de la raíz hasta el último alcance anidado votan para comprometer la transacción, se comprometerá la transacción ". –

+1

Estoy seguro de que lo sabe, pero los términos "transacción interna" y "transacción anidada" son IMHO inapropiados cuando se habla de TransactionScope, porque en realidad no hay transacciones anidadas, sino solo TransactionScopes anidados. Si elige TransactionScopeOption.Required, es solo 1 transacción grande y con TransactionScopeOption.RequiereNew hay 2 transacciones completamente independientes, pero no están anidadas en el sentido de transacciones (cerradas) anidadas. –

68

Depende de la opción de alcance con la que inicie el ámbito de transacción anidado.

Si usa la opción predeterminada TransactionScopeOption.Required, el alcance anidado se enlistará en la misma transacción que el ámbito externo y, como tal, cuando el ámbito externo retroceda, el ámbito interno también se retrotraerá aunque haya llamado al Complete.

Si, sin embargo, usa TransactionScopeOption.RequiresNew, el alcance anidado comenzará su propia transacción y lo completará por separado del ámbito externo, por lo que no se retrotraerá aunque el alcance externo retroceda.

Si utiliza TransactionScopeOption.Suppress, el alcance anidado no participará en la transacción externa y se completará de forma no transaccional, por lo tanto no forma parte del trabajo que se retrotraerá si la transacción externa se retrotrae.

+0

Respuesta perfecta :) –

Cuestiones relacionadas