Implementando transacciones en múltiples bases de datos

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

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 fallaría horriblemente si ocurre una excepción durante un Commit() (vea el comentario). ¿Hay alguna forma mejor de lograr esto?

Utilice la clase TransactionScope de esta manera:

 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.

Usar transactionScope es la respuesta. Incluso funciona con diferentes DBMS !!!

Transacciones en múltiples bases de datos

Como dijo Cletus, necesitas algún tipo de compromiso en dos fases . 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.

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

Si desea ejecutar una transacción en varias instancias de SQL Server, eche un vistazo a la documentación del Coordinador de transacciones distribuidas de Microsoft.