¿Cuáles son las mejores prácticas para realizar transacciones en C # .Net 2.0? ¿Cuáles son las clases que deberían usarse? Cuáles son las trampas a tener en cuenta, etc. Todo lo que se compromete y revierte. Estoy comenzando un proyecto en el que podría necesitar hacer algunas transacciones mientras inserto datos en la base de datos. Cualquier respuesta o enlace para incluso cosas básicas sobre transacciones son bienvenidas.
c#
.net
transactions
Malik Daud Ahmad Khokhar
fuente
fuente
Respuestas:
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):
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:
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:
fuente
fuente
También puede envolver la transacción en su propio procedimiento almacenado y manejarla de esa manera en lugar de realizar transacciones en C #.
fuente
si solo lo necesita para cosas relacionadas con db, algunos OR Mappers (p. ej., NHibernate) admiten transactinos de forma predeterminada.
fuente
También depende de lo que necesites. Para las transacciones SQL básicas, puede intentar realizar transacciones TSQL utilizando BEGIN TRANS y COMMIT TRANS en su código. Esa es la forma más fácil, pero tiene complejidad y hay que tener cuidado de comprometerse correctamente (y revertir).
Usaría algo como
Cualquier falla lo sacará directamente de la
using
transacción y la transacción siempre se confirmará o revertirá (dependiendo de lo que le diga que haga). El mayor problema que enfrentamos fue asegurarnos de que siempre se comprometiera. El uso asegura que el alcance de la transacción es limitado.fuente