Tengo un IDbTransaction en una declaración de uso, pero no estoy seguro de si se revertirá si se lanza una excepción en una declaración de uso. Sé que una declaración de uso hará cumplir la llamada de Dispose () ... pero ¿alguien sabe si lo mismo es cierto para Rollback ()?
Actualización: Además, ¿necesito llamar a Commit () explícitamente como lo he hecho a continuación o también se ocupará de eso la declaración de uso?
Mi código se parece a esto:
using Microsoft.Practices.EnterpriseLibrary.Data;
...
using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
connection.Open();
using(IDbTransaction transaction = connection.BeginTransaction())
{
//Attempt to do stuff in the database
//potentially throw an exception
transaction.Commit();
}
}
c#
transactions
rollback
using-statement
mezoide
fuente
fuente
Respuestas:
El método Dispose para la clase de transacción realiza una reversión, mientras que la clase de Oracle no lo hace. Entonces, desde la perspectiva de la transacción, depende de la implementación.
La
using
declaración para el objeto de conexión, por otro lado, cerraría la conexión a la base de datos o devolvería la conexión al grupo después de restablecerla. En cualquier caso, las transacciones pendientes deben revertirse. Es por eso que una excepción nunca deja una transacción activa por ahí.Además, sí, debe llamar
Commit()
explícitamente.fuente
Rollback
se llamaDispose
! :)System.Data.OracleConnection
, no se revertirá al desechar. O al menos, para nosotros no es así.Tienes que llamar a commit. La declaración de uso no confirmará nada por usted.
fuente
Creo que si hay una excepción que
Commit()
nunca se llamó, la transacción se revertirá automáticamente.fuente