c# - que - transactionscope timeout
¿Una instrucción using revertirá una transacción de base de datos si se produce un error? (3)
Tengo un IDbTransaction en una declaración de uso, pero no estoy seguro si se retrotraerá si se lanza una excepción en una instrucció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, ¿tengo que llamar a Commit () explícitamente como lo he hecho a continuación o ¿eso también se ocupará de la instrucción using?
Mi código se ve así:
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();
}
}
Aparentemente sí (para SQL Server). Así es como se ve el método Dispose de SqlInternalTransaction (que las llamadas a Dispose de SqlTransaction) se ve desde Reflector :
private void Dispose(bool disposing)
{
// ...
if (disposing && (this._innerConnection != null))
{
this._disposing = true;
this.Rollback(); // there you go
}
}
EDITAR: @Medinoc mencionó que OracleConnection
no hace eso, por lo que parece específico de la implementación.
Creo que si hay una excepción como que nunca se llamó a Commit (), la transacción se revertirá automáticamente.
Debes llamar a commit. La declaración de uso no comprometerá nada para usted.