回滚嵌套事务中的整个事务

2023-11-22

我想要一个嵌套事务使父事务失败。

假设我有以下模型

class Task < ApplicationRecord
  def change_status(status, performed_by)
    ActiveRecord::Base.transaction do
      update!(status: status)
      task_log.create!(status: status, performed_by: performed_by)
    end
  end
end

我总是想要update and task_log创建成为一起执行或根本不执行的事务。

假设我有一个允许我更新多个任务的控制器

class TaskController < ApplicationController
  def close_tasks
    tasks = Task.where(id: params[:_json])

    ActiveRecord::Base.transaction do
      tasks.find_each do |t|
        t.change_status(:close, current_user)
      end
    end
  end
end

我想要这样,如果有任何一个change_status失败,整个请求将从父级别事务回滚。

但是,这不是 Rails 中的预期行为,请参阅有关的文档嵌套事务

他们举了两个例子。

User.transaction do
  User.create(username: 'Kotori')
  User.transaction do
    User.create(username: 'Nemu')
    raise ActiveRecord::Rollback
  end
end

这将创建两个Users“Kotori”和“Nemu”,因为父母从未看到加薪

然后是下面的例子:

User.transaction do
  User.create(username: 'Kotori')
  User.transaction(requires_new: true) do
    User.create(username: 'Nemu')
    raise ActiveRecord::Rollback
  end
end

这只创建了“Kotori”,因为只有嵌套事务失败了。

那么我怎样才能让 Rails 了解嵌套事务是否失败,从而导致父事务失败。继续上面的例子,我希望“Kotori”和“Nemu”都不会被创建。


您可以确保交易不可加入

User.transaction(joinable:false) do 
  User.create(username: 'Kotori')
  User.transaction(requires_new: true, joinable: false) do 
    User.create(username: 'Nemu') and raise ActiveRecord::Rollback
  end 
end 

这将导致类似于以下内容的结果:

SQL (12.3ms)  SAVE TRANSACTION active_record_1
SQL (11.7ms)  SAVE TRANSACTION active_record_2
SQL (11.1ms)  ROLLBACK TRANSACTION active_record_2
SQL (13.6ms)  SAVE TRANSACTION active_record_2
SQL (10.7ms)  SAVE TRANSACTION active_record_3
SQL (11.2ms)  ROLLBACK TRANSACTION active_record_3
SQL (11.7ms)  ROLLBACK TRANSACTION active_record_2 

您当前的示例结果如下

SQL (12.3ms)  SAVE TRANSACTION active_record_1
SQL (13.9ms)  SAVE TRANSACTION active_record_2
SQL (28.8ms)  ROLLBACK TRANSACTION active_record_2

While requires_new: true创建一个“新”事务(通常通过保存点),回滚仅适用于该事务。当该事务回滚时,它只是丢弃该事务并利用保存点。

通过使用requires_new: true, joinable: falseRails 将为这些新事务创建保存点,以模拟真正的嵌套事务的概念,并且当调用回滚时,它将回滚所有事务。

你可以这样想:

  • requires_new: true阻止此事务加入其父事务
  • joinable: false意味着父交易不能被子交易加入

当使用两者时,您可以确保任何事务都不会被丢弃,并且任何地方的 ROLLBACK 都会导致任何地方的 ROLLBACK。

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

回滚嵌套事务中的整个事务 的相关文章

  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • Rails 3 SSL 路由从 https 重定向到 http

    这个问题与此相关SO 问答 rails 3 ssl deprecation https stackoverflow com questions 3634100 rails 3 ssl deprecation建议使用routes rb和类似的
  • 如何全局忽略 UTF-8 字符串中的无效字节序列?

    我有一个 Rails 应用程序从 Rails 版本 1 以来的迁移中幸存下来 我想忽略all其上的无效字节序列 以保持向后兼容性 我不知道输入编码 示例 gt Men xFC split n ArgumentError invalid by
  • 使用设计宝石导轨注销用户

    在管理部分 我显示当前登录用户的列表 现在管理员可以选择一个或多个用户并销毁他们的会话 注销他们 我不知道从哪里开始 请帮助我 您可以使用sign out通过传入用户对象在控制器操作中的方法 Make sure only admins ca
  • 创建费用前验证 CVC 代码

    我正在尝试检查用户输入的 cvc 代码 我已经存储了条带 customer id 和条带 card id 我想在向用户收费之前验证 CVC 代码 以下是创建费用的代码 charge Stripe Charge create amount g
  • ruby 管道、IO 和 stderr 重定向

    我希望有一个 ruby 程序 一个 rake 任务 观察另一个 rake 任务的输出 输出写入器输出到 stderr 我想读一下这些行 我很难设置它 如果我有一个作家 stdout writer rb 不断打印一些东西 usr bin en
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • NameError:未初始化的常量 Gem::SourceIndex

    对于没有任何修改的新 Rails 应用程序 在访问主页时 成功运行后 会出现此错误bundle install 以下是版本号 ruby 1 9 3p392 2013 02 22 revision 39386 x86 64 darwin12
  • 启动同一作业的多个延迟作业进程

    我在运行多个工作人员的设置中使用延迟作业 就我的问题而言 这并不重要 但假设我运行 10 个工作线程 当前在开发模式下执行此操作 我遇到的问题是两个不同的工作人员有时开始处理同一项工作 调用我的工作对象上的执行方法 据我所知 延迟作业正在使
  • Rails 3 best_in_place 编辑在不刷新页面的情况下无法工作

    我从Bernat的博客rails迷你教程中获取了评论代码 我尝试使用他的 best in place gem 添加就地编辑功能 在大多数情况下它工作正常 我的代码部署在http falling spring 3964 herokuapp c
  • 保护 REST 和 JSON

    我想利用 RESTful 架构构建提供 JSON 数据的 Web 服务 但我只想要我自己的客户端应用程序可以从我的网络服务请求 基本上 我的 Web 服务包含不供公众使用的敏感数据 但我想以这种方式构建它 以便我可以构建连接到我的 Web
  • Rails 中的助手 - 构建 html 字符串时的最佳方法是什么?

    我通常这样写助手 def bloco vazio texto btn args titulo content tag h3 Vazio p content tag p texto content tag div titulo tag hr
  • 如何使用国家宝石

    我正在尝试使用国家宝石 https github com hexorx countries 但是在我捆绑安装这个 gem 后 有一些关于如何合并它的基本问题 我是否需要创建新的控制器 模型才能访问这些国家 地区 如何创建一个简单的选择下拉列
  • Rails 如何使用 send_data 导出数据,然后重定向到新页面?

    我有一个 Rails 应用程序 允许用户下载生成的 CSV 文件 下载文件后 我想将用户重定向到新的 URL 或操作 有没有在 send data 之后进行重定向的技巧 我想做这样的事情 这不起作用 send data output typ
  • Rails3/will_paginate/Ajax - 下一个/上一个链接无法正常工作(这是一个错误吗?)

    我正在遵循 使用ajax分页 http railscasts com episodes 174 pagination with ajax railscast 用于我的 Rails 3 应用程序 一切似乎都运行良好 除了上一个和下一个链接根本
  • 更改 Active Storage 的默认 URL

    我们可以更改从活动存储创建的默认 永久 url 以重定向到 S3 类似于rails active storage representations 我不喜欢网址中的框架名称 Thanks UPDATE 最近 Rails 6 中增加了一个可配置
  • <%=h ... %> 在 Rails 中意味着什么?

    I found here http api rubyonrails org classes ActionView Helpers RecordTagHelper html以下语法 什么是h means 它用于转义标签的输出以避免跨站点脚本
  • 是否有像数据库的 JDBC 一样的 NoSQL/键值存储抽象库?

    我使用过很多 SQL 抽象库 例如 ODBC JDBC 和 ActiveRecord NoSQL 键值存储世界中有哪些抽象选项 我主要是问这个问题 这样如果我选择键值存储 那么我就可以使用抽象库而不会被锁定 考虑到周围键值存储的数量 我认为
  • time_select 表单助手将新时间对象解释为 UTC,而不是配置的时区

    我遇到了对我来说似乎很简单的问题 但我无法弄清楚我做错了什么 在我的应用程序中 用户可以通过简单的 form for 添加他们的课程 他们可以输入课程讲座的开始时间和结束时间 如下所示 div class field Start Time
  • Rails content_for 和yield 之间有什么区别?

    例如 content for stuff vs yield stuff 我知道它们的实现略有不同 但是有任何真正的功能差异吗 是否有普遍接受的最佳实践 yield是您指定内容区域在布局中的位置的方式 你可能有这样的事情 div h1 Thi

随机推荐

  • PLSQL从XML读取值?

    我有一个带有 XML 代码的字符串 我想在 PL SQL 中将它的值提取到变量中 XML 非常简单 与此没有什么不同
  • ReactJS 如何设置默认选中复选框?

    在分配默认值后 我无法更新复选框状态checked checked 在反应中 var rCheck React createElement input type checkbox checked checked value true Che
  • javax.naming.NameNotFoundException:名称 jdbc 未在此上下文中绑定

    我正在从事网络服务 并且是初学者 我尝试在服务文件中获取 Oracle Db 连接 但收到以下错误 javax naming NameNotFoundException Name jdbc is not bound in this Cont
  • 使用 ant 构建 Android 测试时如何使用 emma 过滤器?

    我知道在构建 Android 测试项目时如何在 ant 中使用 emma 但在使用 SDK 时找不到任何有关如何使用过滤器的提示 emma 网站在自己调用 emma 时对此进行了解释 但在 Android SDK 构建文件中 emma 并未
  • 强制浏览器获取asp.net应用程序中最新的js和css文件

    有些浏览器会缓存 js 和 css 文件 除非您强制刷新 否则无法刷新它们 最简单的方法是什么 我刚刚实施了这个似乎有效的解决方案 在页面上声明版本变量 public string version get set 从 web config
  • C++ - 为什么我要在堆上创建这些小部件?

    使用 C 和 Qt 创建 GUI 时 您可以创建一个标签 如下所示 QLabel label new QLabel Hey you centralWidgetParent 这会在堆上创建对象 并将一直保留在那里 直到我手动删除它或父对象被销
  • C++ 类对象内存映射

    当我们创建一个类的对象时 它的内存映射是什么样的 我更感兴趣的是对象如何调用非虚拟成员函数 编译器是否创建一个像 vtable 这样在所有对象之间共享的表 class A public void f0 int int in b1 A a n
  • 处理嵌套 React 组件的状态变化

    所以 我有多个 ReactComponent 最初 我认为会有一个具有自己状态的父组件 让我们称之为 GrandPa 并且它将有关其状态的一些信息传递给另一个组件 称之为 Parent 同样 Parent 将他的一些传递给 Child ch
  • 如何使用 @WebMvcTest 并添加我自己的自定义过滤器?

    添加了 Spring Boot 1 4 WebMvcTest连接测试我的应用程序的 Web 切片所需的部件 这太棒了 但是我还想确保我的自定义过滤器和安全代码已连接 以便我可以验证其是否也正常工作 使用时如何添加自定义过滤器 WebMvcT
  • 使用 MySql 和 MVC 3 上的会员资格向注册表单添加更多字段

    我创建了一个基于 asp net MVC 3 和 MySql 的网站 我获得了使用 MySQL NET 连接器的会员资格 因此 使用默认应用程序 您可以使用 mvc 3 的新项目获得一个工作注册表单和一个工作登录表单 但是 我如何在注册表中
  • React-Native fetch 中的“then(res => res.json())”是什么意思? [复制]

    这个问题在这里已经有答案了 是什么意思then res gt res json 在下面的react native fetch 代码片段中 fetch url then res gt res json then res gt this set
  • React Hooks useCallback 如何“冻结”闭包?

    我想知道 React 如何在使用时 冻结 闭包useCallback钩子 以及其他钩子 然后仅在将钩子内使用的变量传递到inputs范围 我知道 冻结 可能不是很清楚 所以我创建了一个 REPL it 来显示我的意思 https repl
  • hdfs数据节点与namenode断开连接

    我在cloudera manager中不时收到以下错误 This DataNode is not connected to one or more of its NameNode s and The Cloudera Manager age
  • 如何在 VB.NET 中使用“Into”LINQ 表达式?

    我正在从 C 转换这个 LINQ 表达式 然而 它似乎不起作用 C return from w in fishSticks group w by w FishQty into g orderby g Key descending selec
  • 实体框架5 MaxLength

    我正在使用 EF4 和我发现的一段代码MaxLength来自这样的实体的价值 public static int GetMaxLength string entityTypeName string columnName int result
  • jqgrid 中带有 JSON 数据的树形网格

    我正在 jqgrid 中测试树 到目前为止我只能创建如下所示的内容 我想要有类似的东西jqGrid 演示页面 我想出了下面的代码 但不知道应该如何从给定的 json 格式扩展树中的每一行 table cellspacing 0 cellpa
  • 如何向 TFSBuild.proj 添加时间戳?

    我有一个 TFSBuild proj 文件 我需要添加日期 时间日志记录以进行统计 即构建的哪些部分花费最多时间以及我们可以在哪里改进流程 构建将日志输出到BuildLog txt 我使用以下标签来获取 BuildLog txt 文件中的自
  • 在 Today 扩展中使用 AppDelegate

    我正在尝试为我的应用程序构建一个今日扩展 我在用着CoreData and NSFetchedResultsController并得到以下错误 使用未声明的类型 AppDelegate 在这行代码中 var appDel AppDelega
  • Http响应代码302

    我正在使用模拟器 BB 8900 我尝试连接到 url 并获取响应代码 302 这是什么意思 这是我的代码片段 import javax microedition io Connector import javax microedition
  • 回滚嵌套事务中的整个事务

    我想要一个嵌套事务使父事务失败 假设我有以下模型 class Task lt ApplicationRecord def change status status performed by ActiveRecord Base transac