2009-08-27 43 views
6

Deseo crear una transacción, escribir algunos datos en una subtransacción, leer los datos y deshacer la transacción.Problema de TransactionScope múltiple

using(var transaction = new TransactionScope()) 
{ 
    using(var transaction = new TransactionScope()) 
    { 
      // save data via LINQ/DataContext 
      transaction.Complete(); 
    } 
    // Get back for assertions 
    var tempItem = // read data via LINQ/DataContext THROWS EXCEPTION 
} 

Pero mientras que la lectura llegue "System.Transactions.TransactionException: La operación no es válida para el estado de la transacción.".

¿Cómo debo establecer las propiedades de transacción para evitar esto?

+0

¿Qué db estás usando? – TheVillageIdiot

+0

Microsoft SQL 2005 – boj

+0

puede ayudar a http://stackoverflow.com/questions/2884863/under-what-circumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

Respuesta

9

Esta excepción no se puede depurar sin el seguimiento completo de la pila. Tiene un significado diferente según el contexto. Por lo general, significa que estás haciendo algo que no deberías hacer dentro de la transacción, pero sin ver las llamadas de DNS o el seguimiento de la pila todo lo que uno puede hacer es adivinar. Algunas de las causas comunes que conocen (y esto no es en absoluto exhaustiva estoy seguro) incluyen:

  1. Acceso a múltiples fuentes de datos (es decir, diferentes cadenas de conexión) dentro de un anidado TransactionScope. Esto provoca la promoción a una transacción distribuida y, si lo hace, no ejecuta DTC, fallará. La respuesta generalmente es no para habilitar DTC, pero para limpiar su transacción o ajustar el otro acceso a datos con un nuevo TransactionScope(TransactionOptions.RequiresNew).
  2. Excepciones no controladas dentro del TransactionScope.
  3. Cualquier operación que viole el nivel de aislamiento, como intentar leer filas recién insertadas/actualizadas.
  4. bloqueos de SQL; las transacciones pueden incluso atascarse en ciertos casos, pero si se aplica el n. ° 1, aislar otras operaciones en nuevas transacciones puede causar interbloqueos si no tiene cuidado.
  5. Tiempos de espera de la transacción.
  6. Cualquier otro error de la base de datos.

Definitivamente no conozco todas las causas posibles, pero si publica el seguimiento completo de la pila y las llamadas a DB reales en su código, le echaré un vistazo y le haré saber si veo algo.

+0

Andy, gracias por esta respuesta. Pregunta en el n. ° 3 re: "cualquier operación que viole el nivel de aislamiento". ¿Violaría el siguiente el nivel de aislamiento? DECLARACIÓN (atSmbol) someCount INT; ACTUALIZACIÓN dbo.Algo SET (atSmbol) someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 En mi uso (atSmbol) someCount es un parámetro de salida. En caso afirmativo, ¿esto no violaría el nivel de aislamiento? DECLARACIÓN (atSmbol) someCount INT; ACTUALIZACIÓN dbo.Something SET [SomeCount] = (atSmbol) someCount = [SomeCount] + 1 donde id = 123 Nota, se cree que estoy tratando de etiquetar a alguien para la notificación cuando se utiliza un símbolo arroba. – Wes

4

Tiene dos objetos TransactionScope anidados ??

Y no intente capturar bloque.

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

creo que encontrará la respuesta específica es que no se puede completar una transacción que no ha empezado nada, está en un estado no válido. ¿De verdad tiene algún código donde están sus comentarios LINQ? ¿una conexión realmente se establece?

+0

Sí, anidado. Pero, ¿por qué ha vinculado MSDN? – boj

+0

porque el artículo vinculado explica por qué está recibiendo esa excepción, tal vez? –

+0

@boj: porque tiene un ejemplo de uso con buenos comentarios explicando qué ocurre y cuándo. –

Cuestiones relacionadas