Hay 2 tipos principales de transacciones; transacciones de conexión y transacciones ambientales. Una transacción de conexión (como SqlTransaction) está vinculada directamente a la conexión db (como SqlConnection), lo que significa que debe seguir pasando la conexión, en algunos casos está bien, pero no permite "crear / usar / liberar" uso, y no permite el trabajo cross-db. Un ejemplo (formateado para espacio):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
No demasiado desordenado, pero limitado a nuestra conexión "conn". Si queremos llamar a diferentes métodos, ahora tenemos que pasar "conn".
La alternativa es una transacción ambiental; nuevo en .NET 2.0, el objeto TransactionScope (System.Transactions.dll) permite su uso en un rango de operaciones (los proveedores adecuados se alistarán automáticamente en la transacción ambiente). Esto facilita la adaptación en el código existente (no transaccional) y hablar con múltiples proveedores (aunque DTC se involucrará si habla con más de uno).
Por ejemplo:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Tenga en cuenta aquí que los dos métodos pueden manejar sus propias conexiones (abrir / usar / cerrar / desechar), sin embargo, se convertirán silenciosamente en parte de la transacción ambiental sin que tengamos que pasar nada.
Si su código falla, se llamará a Dispose () sin Complete (), por lo que se revertirá. Se admite el anidamiento esperado, etc., aunque no puede revertir una transacción interna y completar la transacción externa: si alguien no está contento, la transacción se cancela.
La otra ventaja de TransactionScope es que no está vinculada solo a las bases de datos; cualquier proveedor de transacciones puede usarlo. WCF, por ejemplo. O incluso hay algunos modelos de objetos compatibles con TransactionScope (es decir, clases .NET con capacidad de reversión, tal vez más fácil que un recuerdo, aunque nunca he usado este enfoque).
En definitiva, un objeto muy, muy útil.
Algunas advertencias:
- En SQL Server 2000, un TransactionScope irá a DTC inmediatamente; esto se soluciona en SQL Server 2005 y versiones posteriores, puede usar el LTM (mucho menos sobrecarga) hasta que hable con 2 fuentes, etc., cuando se eleva a DTC.
- Hay un problema técnico que significa que es posible que deba ajustar su cadena de conexión