使用事务或 SaveChanges(false) 和 AcceptAllChanges()?

2023-12-25

我一直在调查交易,只要我通过,它们就会在 EF 中自行处理false to SaveChanges()然后打电话AcceptAllChanges()如果没有错误:

SaveChanges(false);
// ...
AcceptAllChanges();

如果出现问题怎么办?我不需要回滚,或者一旦我的方法超出范围,事务就会结束​​吗?

在事务中途分配的任何缩进列会发生什么情况?我想如果其他人在我的记录变坏之前在我的记录之后添加了一条记录,那么这意味着将缺少身份值。

有什么理由使用该标准TransactionScope我的代码中的类?


大部分时间使用实体框架SaveChanges()足够了。这将创建一个事务,或加入任何环境事务,并在该事务中执行所有必要的工作。

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

最有用的地方是您想要跨两个不同上下文执行分布式事务的情况。

IE。像这样的东西(不好):

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();
}

If 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某处。

See my https://twitter.com/adjames 博客文章 https://learn.microsoft.com/en-gb/archive/blogs/alexj/savechangesfalse了解更多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用事务或 SaveChanges(false) 和 AcceptAllChanges()? 的相关文章

随机推荐

  • 使用 JQUERY 检测tinyMCE 文本区域

    在我们的一些表单上 我们将文本区域转换为tinyMCE 文本区域 如何在 jquery 中判断给定的文本区域是否已被转换 我注意到 tinyMCE 会在初始化时将原始文本区域的显示更改为无 然后使用 mceEditor 类创建相邻的跨度 但
  • 堆空间不足

    我遇到了堆空间问题 我的程序很简单 有两个参与者 发送和接收 发送 参与者每秒将 10000 个对象传递给 接收 而接收则发布这些对象 接收者收到的对象被保存在容器中 但容器每秒都被清空 所以容器不可能空间不足 现在 在 420000 个对
  • Node.js 传递变量

    我正在寻找一些经验丰富的 Node js 程序员的指导 我遇到的最大问题是将变量传递到单独的模块中 例如 在我的 server js 中 我有以下内容 var db mongoose createConnection localhost t
  • 移动 lambda:一旦移动捕获了仅移动类型,如何使用 lambda? [复制]

    这个问题在这里已经有答案了 这个答案 https stackoverflow com a 20669290 1858225解释了如何在 C 14 中移动捕获 lambda 中的变量 但是一旦你移动捕获了一个不可复制的对象 例如std uni
  • 文本环绕绝对定位的 div

    我知道有一些关于类似主题的问题 但它们主要涉及浮动 div 图像 我需要将图像 和 div 绝对定位 向右 但我只想让文本围绕它流动 如果我浮动 div 它会起作用 但我无法将其放置在我想要的位置 因为文本只是在图片后面流动 div cla
  • Ruby:将嵌套 Ruby 哈希转换为非嵌套哈希

    现在 我有一个服务器调用返回以下 Ruby 哈希值 id gt ct factualId gt outOfBusiness gt false publishedAt gt 2012 03 09 11 02 01 general gt nam
  • 为什么MIPS汇编器有多个寄存器用于返回值?

    我刚刚开始学习MIPS汇编程序并意识到有两个寄存器 http en wikipedia org wiki MIPS architecture Compiler register usage用于返回值 首先 我认为它的实现是因为有些语言可能返
  • 如何删除使用 distutils 安装的程序?

    我已经用这个 setup py 安装了一个 python 应用程序 usr bin env python from distutils core import setup from libyouandme import APP NAME A
  • 将 JPanel 导出到图像

    所以我一直在尝试将在 JPanel 上绘制的图像导出为图像 我一直在使用这个方法 BufferedImage image new BufferedImage getWidth getHeight BufferedImage TYPE INT
  • MySQL 表作为 FIFO/队列

    我们如何才能将Mysql表视为有限的FIFO缓冲区 队列 目标是 该表一次只能有 N 行 当插入一行时 应删除最旧的行以保持行数为 N 请建议方法 UPDATE 抱歉 伙计们 正如很多人指出的那样 我将问题从 STACK 更改为 FIFO
  • Maven 和 Jenkinsfile - 跳过前面的阶段

    我正在探索 Jenkins 的暂存功能 我想设计一个快速且精益的设置 基本上 Jenkins 提倡使用阶段来划分构建过程 并提供有关构建进度的良好视觉反馈 So the Jenkinsfile有点像 stage Build bat mvn
  • 如何将 HTML NSData 转换为 NSString?

    我在用着 NSData dataWithContentsOfURL 创建两个 NSData 实例 我想比较这些实例以了解它们的不同之处 由于它们都来自同一个网站 因此使用字符串查找不同之处将帮助我突出显示已更改的实际元素 是否可以将这些数据
  • Hibernate EnVers 中的 @NotAudited 和 RelationTargetAuditMode.NOT_AUDITED 有什么区别?

    NotAudited Audited targetAuditMode RelationTargetAuditMode NOT AUDITED OneToMany mappedBy booking OrderBy bookingOrder p
  • Django Rest框架,将api响应Content-Encoding设置为gzip

    我正在开发 django 项目 当其他服务器通过 api 调用请求某些数据时 该项目充当其他服务器的分发服务器 该数据采用 JSON 形式 并且非常大 所以我在想有没有什么方法可以设置我的 DRF APIView 响应来提供输出的 JSON
  • 使用 django Rest Framework jwt 将信息添加到 JWT 令牌主体

    我使用 django Rest Framework 和 djangorestframework jwt 包来创建 JWT 令牌以进行授权 在前端 我可以解码令牌并获取用户名 电子邮件和 user id 不过我想检索一些额外的信息 例如 如果
  • SQL 条件相交

    我想知道我们是否可以做相交条件 有一些查询 但结果是错误的 始终为空 我写下它应该产生的结果 DECLARE CAN USE TABLE1 BIT DECLARE CAN USE TABLE2 BIT DECLARE CAN USE TAB
  • 我们如何从布局中删除动态添加的片段

    谁能帮我 我有一个片段说 FRAGMENT A 并将其动态添加到布局中 假设我已将 3 个 FRAGMENT A 实例添加到该布局中 那么我如何以编程方式删除该 3 个片段实例 我尝试了谷歌搜索和另一个 stackoverflow线程但它们
  • 为什么归并排序中的归并操作是O(n)?

    对于归并排序分而治之的操作 自下而上的归并阶段需要多少时间 我的老师说它是线性的 因此它将是O n 但我没有明白 它将如何线性化 合并操作如何是线性的O n 两个数组的合并操作 是扫描数组并选择两个数组中的最低 最高 所以你有了 a 1 3
  • Objective-C 中如何返回到之前的视图?

    我是iOS编程的初学者 我想实现返回主视图的功能 我已经使用这个代码 IBAction onclickhome id sender self navigationController popViewControllerAnimated YE
  • 使用事务或 SaveChanges(false) 和 AcceptAllChanges()?

    我一直在调查交易 只要我通过 它们就会在 EF 中自行处理false to SaveChanges 然后打电话AcceptAllChanges 如果没有错误 SaveChanges false AcceptAllChanges 如果出现问题