实体框架:SaveData之后完全交易完成了吗?

时间:2018-02-13 18:46:46

标签: sql-server asp.net-mvc entity-framework-6

使用MVC5,EntityFramework6 Web应用程序。通常在我的类中,我在类范围中定义我的上下文var ...

[Authorize]
public class MyResultsController : Controller
{
    private readonly XYZ_MyContext db = new XYZ_MyContext();

然后,只要我想访问上下文,我就会引用'db'。

在我保存数据的方法中,我这样做......

this.db.SaveChanges();

我通常不使用Using语句。

我的问题是......

(1)在你调用SaveChanges时,如果没有错误输出,那么交易完成了吗?你不必明确地结束它? (数据暂时没有缓存,等等......)

(2)另外,如果我看到数据库中的实际数据是100%完成交易吗?换句话说,如果我能看到数据表中的数据(通过SSMS),除非明确删除数据,否则数据不会“消失”,对吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

是。如果您调用SaveChanges()的行完成而没有抛出异常,则交易将完成。

  

在所有版本的Entity Framework中,每当您执行SaveChanges()以在数据库上插入,更新或删除时,框架都会将该操作包装在事务中。此事务仅持续足够长的时间来执行操作然后完成。当您执行另一个此类操作时,将启动一个新事务。

请参阅MSDN documentation

  

另外,如果我看到数据库中的实际数据是100%完成的事务肯定吗?

如果您在事务中执行了INSERT,并且随后从您要插入的同一个表中执行了SELECT,那么您将在事务完成之前查看您的插入的任何结果,除非您在WITH (NOLOCK)查询中包含SELECT提示。

如果您执行SELECT并且确实包含WITH (NOLOCK)提示,那么可能会有一个"脏读",您可能会在其中看到表格中的行在事务期间插入到表中,但如果事务失败,可能随后回滚。