entity-framework - transacciones - transactions entity framework core
DbContextTransaction Rollback (2)
Entity Framework 6 introdujo una nueva forma de admitir transacciones en DbContext con el método BeginTransaction:
var db = new MyDbContext();
using(var tx = db.Database.BeginTransaction())
{
// update entities
try
{
db.SaveChanges();
tx.Commit();
}
catch(Exception)
{
tx.Rollback();
}
}
¿Es necesaria la llamada Rollback () en el método? ¿Qué sucede si no se llama en una excepción? Sé que cuando se usa TransactionScope, la transacción se retrotraerá automáticamente cuando se elimine y no se llame a Complete. ¿DbContextTransaction se comporta de manera similar?
Para el EF, el proveedor de la base de datos es arbitrario y conectable, y el proveedor puede ser reemplazado por MySQL o cualquier otra base de datos que tenga una implementación del proveedor de EF. Por lo tanto, desde el punto de vista de EF, no hay garantía de que el proveedor revertirá automáticamente la transacción dispuesta, porque el EF no conoce la implementación del proveedor de la base de datos.
Esta respuesta explica todo y la confusión con todos los documentos msdn que tienen ese Rollback llamado explícitamente: https://.com/a/28915506/5867244
No, no es necesario llamar explícitamente Rollback. La variable tx se eliminará cuando finalice el uso del bloque, y la transacción se retrotraerá si no se ha llamado a Commit ().
He probado esto utilizando el Monitor de actividad de SQL Server, observando los bloqueos que se guardan en los objetos de la base de datos, así como consultando la base de datos para observar cuándo se retrotraen los datos, usando la sugerencia nolock en mi declaración de selección para poder ver los datos no confirmados Cambios en la base de datos.
Por ejemplo, select top 10 * from [tablename] (nolock) order by modifiedDate