ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 具有单个和多个SaveChanges()调用的Entity Framework(6)事务之间的区别是什么

2019-05-19 15:04:35  阅读:216  来源: 互联网

标签:c transactions entity-framework-6


我想知道在这三种方式之间在同一数据库上下文中执行事务的实际差异是什么:

1)使用一个SaveChanges()进行多个操作,而不显式使用sql事务

using (TestDbContext db = new TestDbContext())
{
    // first operation
    // second operation
    db.SaveChanges();
}

2)使用sql事务,使用一个SaveChanges()进行多个操作

using (TestDbContext db = new TestDbContext())
using (DbContextTransaction trans = db.Database.BeginTransaction())
{
     // operation 1
     // operation 2
     db.SaveChanges();    
     trans.commit();
}

3)使用sql事务进行多个SaveChanges()的多个操作

using (TestDbContext db = new TestDbContext())
using (DbContextTransaction trans = db.BeginTransaction())
{
     // operation 1
     db.SaveChanges();    
     // operation 2
     db.SaveChanges();

     trans.commit();
}

在(2)和(3)中,如果commit()应该实际执行对数据库的请求的sql查询,是否真的不同,比如,保存每个操作的更改或一次保存所有操作的更改?

如果(1)也可以允许在同一个数据库上下文中安全地执行多个操作,那么手动启动事务的主要用途是什么?我说我们可以手动提供try / catch块来回滚事务,如果发生了不好的事情,但AFAIK,SaveChanges()也会自动覆盖它,至少是SQLServer.

**更新:另一件事是:我应该将数据库上下文和事务变量设置为类级别,还是应该只包含方法本地?

解决方法:

如果您不启动事务,则它是隐式的.这意味着,您执行的所有SaveChanges()将在调用后立即在数据库中可用.

如果启动事务,SaveChanges()仍会执行更新,但在调用提交之前,数据不可用于其他连接.

您可以通过设置断点,创建新对象,将它们添加到上下文以及执行SaveChanges()来自行测试.您将看到ID属性在该调用之后将具有值,但在您对事务执行提交之前,数据库中将没有相应的行.

至于你的第二个问题,它实际上取决于并发需求,你的班级正在做什么以及你正在使用多少数据.这不是一个范围问题,而是一个代码执行问题.

上下文不是线程安全的,因此只要您的应用程序中只有一个线程访问上下文,您就可以在更广泛的范围内进行上下文.但是,如果应用程序的其他实例正在访问数据,则您必须确保将数据刷新到最新模型.您还应该考虑到已经加载到内存中的模型越多,随着时间的推移速度就越慢.

我倾向于将我的上下文创建为尽可能接近要执行的操作,并在不久后将其处理掉.

标签:c,transactions,entity-framework-6
来源: https://codeday.me/bug/20190519/1136098.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有