栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用事务还是SaveChanges(false)和AcceptAllChanges()?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用事务还是SaveChanges(false)和AcceptAllChanges()?

使用实体框架,大多数时间

SaveChanges()
就足够了。这将创建一个事务,或加入任何环境事务,并在该事务中完成所有必要的工作。

尽管有时

SaveChanges(false) + AcceptAllChanges()
配对很有用。

最有用的地方是要在两个不同的上下文之间进行分布式事务的情况。

即像这样(不好):

using (TransactionScope scope = new TransactionScope()){    //Do something with context1    //Do something with context2    //Save and discard changes    context1.SaveChanges();    //Save and discard changes    context2.SaveChanges();    //if we get here things are looking good.    scope.Complete();}

如果

context1.SaveChanges()
成功但
context2.SaveChanges()
失败,则整个分布式事务将中止。但是很遗憾,实体框架已经放弃了对的更改
context1
,因此您无法重播或有效地记录故障。

但是,如果您将代码更改为如下所示:

using (TransactionScope scope = new TransactionScope()){    //Do something with context1    //Do something with context2    //Save Changes but don't discard yet    context1.SaveChanges(false);    //Save Changes but don't discard yet    context2.SaveChanges(false);    //if we get here things are looking good.    scope.Complete();    context1.AcceptAllChanges();    context2.AcceptAllChanges();}

在调用

SaveChanges(false)
将必要的命令发送到数据库时,上下文本身不会更改,因此您可以在必要时再次进行操作,也可以根据需要进行询问
ObjectStateManager

这意味着,如果事务实际上抛出异常,您可以通过在

ObjectStateManager
某个地方重试或记录每个上下文的状态来进行补偿。

有关更多信息,请参见我的
博客文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433118.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号