Debe tenerse en cuenta que al utilizar el TransactionScope
no hay necesidad de que el try/catch
constructo que tiene. Simplemente debe llamar al Complete
en el alcance para comprometer la transacción cuando se sale del alcance.
Dicho esto, TransactionScope
suele ser una mejor opción porque le permite anular llamadas a otros métodos que pueden requerir una transacción sin tener que pasar el estado de la transacción.
Al llamar al BeginTransaction
en el objeto DbConnection
, debe pasar ese objeto transaccional si desea realizar otras operaciones en la misma transacción, pero con un método diferente.
Con TransactionScope
, mientras el alcance exista, manejará todo lo que se registre con el Transaction
actual en la secuencia, haciendo que su código sea más limpio y más fácil de mantener.
Además de eso, tiene la ventaja adicional de poder utilizar otros recursos que pueden participar en transacciones, no solo la conexión a la base de datos.
Debe tenerse en cuenta que en situaciones en las que necesita aprovechar al máximo sus conexiones y operaciones de base de datos, es posible que no desee utilizar TransactionScope
; incluso contra una única base de datos, se ejecuta la posibilidad de que se utilice el Coordinador de transacciones distribuidas y que la transacción se convierta en una transacción distribuida (incluso para una única conexión de base de datos).
En estos casos, mientras enturbia su diseño, es posible que desee considerar pasar una transacción específica de conexión.
O, si sabe que usará un recurso consistentemente (y en el mismo subproceso), es posible que desee crear una clase que cuente como referencia su conexión/transacción.
Debería crear una clase que durante la construcción, cree su recurso/incremente el recuento. También implementaría IDisposable
(en el que disminuiría/liberar/confirmar/abortar cuando el recuento es cero), y almacenar el recuento en una variable que tiene ThreadStaticAttribute
aplicado.
Esto le permite separar la gestión de transacciones del código lógico, y aún aferrarse a un recurso singular con bastante eficiencia (en lugar de escalar a una transacción distribuida).
Si necesita enviar algo con propiedades cíclicas (común), acierta un error en LINQ to SQL que requiere que elimine una parte de cada referencia bidireccional, envíe, repare las referencias bidireccionales y envíe nuevamente. Debe envolver todo esto en su propia transacción para hacerlo. Es una necesidad común, por lo que "No te preocupes" no es la mejor respuesta. –