实体框架 - SaveChanges 与事务

Posted

技术标签:

【中文标题】实体框架 - SaveChanges 与事务【英文标题】:Entity Framework - SaveChanges vs Transaction 【发布时间】:2022-01-08 02:25:24 【问题描述】:

我有一个有点愚蠢的问题,但我没有找到答案。

在事务中单次调用 SaveChanges() 和单次调用 SaveChanges() 有什么区别吗? (我在 .net core 5 应用程序中使用实体框架)

我想在一个表中创建一条记录并更新另一个表中的数据。

例如,它会是:

users.Password = "..."

var passwordReset = new PasswordReset(...)

_context.Add(passwordReset);
_context.SaveChanges();

还有交易:

using (var transaction = _context.Database.BeginTransaction())

    users.Password = "..."

    var passwordReset = new PasswordReset(...)

    _context.Add(passwordReset);
    _context.SaveChanges();

    transaction.Commit();

我想确保两个查询都能成功完成,但我不知道哪个选项最适合我。

提前致谢

【问题讨论】:

一般数据库规则:一个事务的所有操作要么失败要么成功。如果一个事务有多个数据库更改,它们要么全部发生(提交时),要么没有发生(回滚)。 |通常围绕非常单一的创建、更新或删除操作存在隐式事务。这是保存,但如果您正在执行批量操作,可能会对性能产生影响。 |对于批量操作,通常最好进行一个显式事务,这样您就不会在隐式的“事务开始、操作、事务提交”垃圾邮件上浪费大量时间。 【参考方案1】:

在事务中,单次调用 [to] SaveChanges() 和 [a] 单次调用 [to] SaveChanges() 之间有什么区别吗? (我在 .net core 5 应用程序中使用实体框架)

不是真的。对SaveChanges() 的一次调用形成它自己的事务。使用事务是一种将多个对SaveChanges 的调用组合在一起的方法,因此它们可能全部成功或全部失败(或者具有更细粒度的控制以在失败时部分回滚)。

参见transactions in EF Core上的参考

【讨论】:

以上是关于实体框架 - SaveChanges 与事务的主要内容,如果未能解决你的问题,请参考以下文章

嵌套事务 DbContext SaveChanges 引发异常

实体框架 SaveChanges 不保存数据

实体框架性能问题,saveChanges 很慢

实体框架核心错误? SaveChanges 抛出选择

在 SaveChanges 的实体框架中出现错误

无法使用 DbContext 实体框架核心 SaveChanges()