¿Revertirá una sentencia using una transacción de base de datos si se produce un error?


Tengo una IDBTransaction en una sentencia using, pero no estoy seguro de si se revertirá si se lanza una excepción en una sentencia using. Sé que una sentencia using forzará la llamada a Dispose ()...pero ¿alguien sabe si lo mismo es cierto para Rollback ()?

Update: Además, ¿necesito llamar a Commit() explícitamente como lo he hecho a continuación o eso también será atendido por 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();
    }
}
Author: mezoid, 2009-03-13

3 answers

Aparentemente sí (para SQL Server). Así es como se ve el método Dispose de SqlInternalTransaction (al que SqlTransaction llama Dispose) 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 una implementación específica.

 90
Author: Sedat Kapanoglu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-21 19:57:22

Tienes que llamar a commit. La declaración using no confirmará nada por usted.

 17
Author: jhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-14 00:57:52

Creo que si hay una excepción tal que Commit() nunca fue llamada, entonces la transacción se revertirá automáticamente.

 4
Author: Tommy Hui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-13 06:38:39