2009-06-30 8 views
6

Estoy realizando cambios de datos en múltiples bases de datos, y quiero implementar una transacción que cubrirá todos los cambios.Implementación de transacciones en múltiples bases de datos

Esto es lo que tengo actualmente:

try 
{ 
    db[1].begintransaction(); 
    db[1].ExecuteNonQuery(); 

    db[2].begintransaction(); 
    db[2].ExecuteNonQuery(); 

    ... 

    db[N].begintransaction(); 
    db[N].ExecuteNonQuery(); 

    // will execute only if no exception raised during the process 
    for (int a = 0; a < N; a++) 
    { 
     db[a].Commit();// what if there is an error/exception here 
    } 
} 
catch 
{ 
    for (int a = 0; a < N; a++) 
    { 
     db[a].RollBack(); 
    } 
} 

El problema es que lo anterior podría fallar horriblemente si una excepción ocurre durante una Commit() (ver el comentario). ¿Hay alguna forma mejor de lograr esto?

+0

Nota: este no es el código real. He modificado significativamente para mayor claridad –

+0

Oye, estoy teniendo el mismo problema ... Y mis bases de datos pueden ser Mysql y Servidor SQL ... ¿Funcionará con TransactionScope? –

Respuesta

12

utilizar la clase TransactionScope así:

using (TransactionScope ts = new TransactionScope()) 
{ 
    //all db code here 

    // if an error occurs jump out of the using block and it will dispose and rollback 

    ts.Complete(); 
} 

La clase TransactionScope se convertirá automáticamente en una transacción distribuida si es necesario.

+0

@Jesse, creo que para transacciones en bases de datos, incluso en la última versión de .Net, se necesitará el Coordinador de transacciones distribuidas de Microsoft. No pude entender por qué dijiste que no sería necesario. – Sunil

+0

@Sunil Tienes toda la razón. Fue un malentendido de mi parte del .NET Framework en ese momento. Voy a proceder a eliminar el comentario erróneo. ¡Gracias por avisarme! =) – Jesse

0

Como dijo cletus, necesitas algún tipo de two-phase commit. Como dice el artículo, esto no siempre funciona en la práctica. Si necesita una solución robusta, debe encontrar una manera de serializar las transacciones de tal forma que pueda hacerlas una después de la otra y deshacerlas individualmente.

Dado que esto depende del caso específico en el que no proporcione ningún detalle, no puedo darle ideas sobre cómo atacar esto.

Cuestiones relacionadas