Pregunta

ARGH !!!

Parece que hay un poco de confusión en torno a los objetos SharedDbConnectionScope y TransactionScope para permitir embalar sus consultas SubSonic dentro de una transacción.

Los documentos sugieren que especifica el uso de SharedDbConnectionScope envuelta alrededor del uso de TransactionScope ...

using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
{
  using(TransactionScope ts = new TransactionScope())
  {
    // do something
    ts.Complete();
  }
}

A continuación, otra pregunta aquí como subsónico: El uso de juntas SharedDbConnectionScope con TransactionScope parece estar roto sugieren los documentos están mal y los dos objetos deben ser al revés ...

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    // do something
    ts.Complete();
  }
}

Sin embargo, mirando en el código fuente estoy aún más confundido.

En el archivo de código SqlQuery.cs que tiene una serie de sobrecargas ExecuteTransaction. Por ejemplo ...

public static void ExecuteTransaction(List<SqlQuery> queries)
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    using(TransactionScope ts = new TransactionScope())
    {
      foreach(SqlQuery q in queries)
        q.Execute();
    }
  }
}

Umm ... Interesante ... coincide con los documentos, pero ... ¿Dónde está la ts.Complete () llamar?

¿Cómo se supone que confirmar la transacción? Por lo que yo puedo ver que siempre será deshacer. Y es el mismo para todas las sobrecargas ExecuteTransaction!

Pero aquí está el golpeador verdadero ...

En el código TransactionWithDtcOffTests.cs tiene algunas pruebas bien, excepto que hayan establecido la SharedDbConnectionScope y TransactionScope por el otro lado!

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope connScope = new SharedDbConnectionScope())
  {
    // <snip />
  }
}

No he tenido la oportunidad de ejecutar las pruebas de SubSonic 2.2 pero supongo que alguien tiene y pasado ..

Por último ...

Puede alguien dar la respuesta definitiva a cómo las transacciones en SubSonic2.2 deben establecerse? Son los documentos de hecho mal? ¿La fuente de las sobrecargas ExecuteTransaction y pruebas de estar alineado con lo que es en realidad forma correcta?

¿Fue útil?

Solución

El (SCS) bloque SharedConnectionScope debe estar dentro de un TransactionScope (TS). El propósito del SCS es prevenir la escalada de la transacción para el MSDTC si es posible, por lo que tener el uso de bloques de TS en el interior de un bloque usando SCS tiene mucho sentido para mí. En cualquier caso, cada bloque de TS debe tener una llamada completa () para la transacción se han confirmado.

Otros consejos

En lo personal he encontrado que cuando se utiliza SQL 2005, SCS debe estar dentro de TS y cuando se utiliza SQL 2000 (con MSDTC), SCS debe envolver TS. Espero que esto ayude ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top