EF5 DbContext.SaveChanges是否处理事务提交和回滚?

8

我不确定是否需要使用TransactionScope还是DbContext.SaveChanges()已足够提交包含多个CRUD操作的事务。我在后台使用SQL Server。


1
相关链接:https://dev59.com/Nm025IYBdhLWcg3wZlLd - George Johnston
1个回答

13
如果您多次调用SaveChanges(),并希望回滚所有更改,则需要使用TransactionScope。如果您在上下文中仅调用一次SaveChanges(),则所有更改都会在幕后以事务的形式一次性推送到数据库中。

以下情况需要确认:如果我为多个CRUD操作调用SaveChanges()一次,则必须处理DbContext对象以回滚事务。 - Jas
我认为释放 DbContext 不会回滚事务。如果是这种情况,您可能需要查看 SaveChanges() 的重载选项,其中您可以禁用事务的自动提交,并且您将负责调用 AcceptAllChanges()。http://msdn.microsoft.com/en-us/library/bb739065.aspx - Steven V
此时,您可以使用新的重载SaveChanges(SaveOptions options),但这似乎不符合您尝试以最少的代码实现的目标。在这种情况下,编写自己的TransactionScope可能是最简单的方法。 - Steven V
由于在不调用transactionScope.Complete()的情况下处理TransactionScope对象会回滚事务,因此对于DbContext,处理DbContext对象时不调用其SaveChanges()方法应该理想地回滚事务。我不确定这一点,但只需要更多关于为什么它与TransactionScope回滚不同的信息。 - Jas
我猜它确实是这样的,但事务是数据库函数,而不是C#函数。因此,如果您创建一个DbContext而没有调用SaveChanges,则对数据库/事务没有任何影响。您只是在C#中向实体添加了对象。当您启动事务范围时,它会在SQL中转换为BEGIN TRANSACTION。当您处置TransactionScope时,它会在SQL中运行ROLLBACK TRANSACTION。如果您使用TransactionScope.Complete(),它将运行COMMIT TRANSACTION - Steven V
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接