2009-04-22 19 views
7

Esto está relacionado con Nested Database transactions in C#.¿Puedo mezclar SqlConnection.BeginTransaction y TransactionScope?

Los objetos en la colección que quiero tomar en transacción implementan sus propias transacciones utilizando el método SqlConnection.BeginTransaction.

Después de leer esto post no estoy seguro de si puedo mezclar esos también o no. Estoy usando SQL Server 2005 y cada objeto usa detalles de conexión de la clase de configuración estática.

¿Alguien tiene experiencia con esto?

Aquí es el código de ejemplo:

using(TransactionScope scope = new TransactionScope()) 
{ 
    for (int i=0; i<=1000....) 
    { 
    SqlConnection con = new SqlConnection() 
    SqlCommand cmd = new SqlCommand("delete from ...", con); 

    try { 
     con.Open(); 
     DbTransaction t = con.BeginTransaction(); 
     cmd.ExecuteNonQuery(); 
     ... 
     cmd.CommandText = .... ; 
     cmd.ExecuteNonQuery(); 
     t.Commit ... 
    } 
    catch { 
     t.Rollback ... 
    } 
    con.Close() 
    } 
} 

Thx

Respuesta

5

Después de pasar horas para configurar MSDTC para trabajar en ambas máquinas, finalmente llegué al punto en el que podía probar el código.

Parece que funciona (con 1 base de datos)

El problema anterior puede ser útil para las personas que no tienen acceso al código fuente, de manera que no puede deshacerse de sistema de "legado" de transacción o si transaccional partes del código no están localizadas o, como en mi caso, no desea meterse demasiado con el código complejo que se ha demostrado estable en el entorno de producción, pero debe introducir transacciones anidadas ...

Avíseme si tiene una experiencia diferente.

+0

Debe marcar su respuesta como la respuesta a esta pregunta - ¡está permitido! – Fenton

+1

En mi caso, tenemos pruebas de "unidad" envueltas en TransactionScope para que en nuestras máquinas de desarrollo podamos lograr complejas manipulaciones de bases de datos sin pensarlo para cada prueba y clase de prueba y tener todo [teóricamente] revertido. Al mismo tiempo, no queremos necesariamente el uso de MS DTC en los servidores de producción, y quería envolver algunas manipulaciones de entidades de Entity Framework compuestas en una transacción regular para que toda la operación pueda deshacerse si alguna de ellas falla ... Lo ideal sería que TransactionScope continúe funcionando, y la transacción interna también debería ... – bambams