使用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),除非明确删除数据,否则数据不会“消失”,对吗?
谢谢!
答案 0 :(得分:0)
是。如果您调用SaveChanges()
的行完成而没有抛出异常,则交易将完成。
在所有版本的Entity Framework中,每当您执行
SaveChanges()
以在数据库上插入,更新或删除时,框架都会将该操作包装在事务中。此事务仅持续足够长的时间来执行操作然后完成。当您执行另一个此类操作时,将启动一个新事务。
另外,如果我看到数据库中的实际数据是100%完成的事务肯定吗?
如果您在事务中执行了INSERT
,并且随后从您要插入的同一个表中执行了SELECT
,那么您将不在事务完成之前查看您的插入的任何结果,除非您在WITH (NOLOCK)
查询中包含SELECT
提示。
如果您执行SELECT
并且确实包含WITH (NOLOCK)
提示,那么可能会有一个"脏读",您可能会在其中看到表格中的行在事务期间插入到表中,但如果事务失败,可能随后回滚。