¿Una declaración de uso revertirá una transacción de base de datos si ocurre un error?

83

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();
    }
}
mezoide
fuente
3
Hola, solo para aclarar el caso de "cometer". Por supuesto, es obligatorio porque el using () {} simplemente llama al método Dispose (). La clase Transaction.Dispose no podía saber si debería Commit o Dispose si el Commit también era automático :)
Manitra Andriamitondra
Consulte también stackoverflow.com/questions/6418992/…
nawfal

Respuestas:

104

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 usingdeclaració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.

Sedat Kapanoglu
fuente
Lo hará, incluso probé esto una vez lanzando explícitamente una excepción.
Pawel Krakowiak
1
Eso es increíble, pero ¿funciona para otras implementaciones de IDbTransaction si lo está usando para compatibilidad entre bases de datos cruzadas?
Matt Hamilton
4
@mezoid: La confirmación nunca se realizará automáticamente. @matt: Deberían, por diseño.
Sedat Kapanoglu
1
@MattHamilton exactamente como dijo ssg. Verifiqué la fuente del conector .net de MySQL, también hicieron lo mismo como se muestra arriba. Rollbackse llama Dispose! :)
nawfal
1
Si está utilizando un System.Data.OracleConnection, no se revertirá al desechar. O al menos, para nosotros no es así.
Medinoc
20

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

jhale
fuente
5
Sí, el usuario llamará a Dispose al salir, que llamará Rollback, no Commit.
asombro
4

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

Tommy Hui
fuente
Sí, eso es lo que tengo entendido. Una transacción permanece hasta que se llama a un compromiso o la conexión termina. En ese punto, el registro de transacciones se actualiza realmente con los cambios o se revierte en el caso de una conexión cerrada (usted sabe que nunca obtendrá una confirmación de una conexión cerrada;)).
Mike