ActiveRecord::Base.transaction do
  Foo.new.bar
end
Foo.new.baz

我能否从bar()baz()方法中通过编程确定事务是否已经发生?寻找可能看起来像

如果相关的话,我使用的是mysql数据库和mysql2 gem,我可以使用一个只适用于mysql的解决方案.

推荐答案

你可以用

ActiveRecord::Base.connection.open_transactions

查看您的方法是否在事务中执行.

ActiveRecord::Base.connection.open_transactions == 0表示您的方法没有在事务中执行.任何大于0的值都意味着您的方法是在事务中执行的.例如ActiveRecord::Base.connection.open_transactions > 0

更新:

来自rails文档

all database statements in the nested transaction block become part of the parent transaction

所以,即使在嵌套事务中,打开的事务数也将是一.

这是我在控制台里得到的

ActiveRecord::Base.transaction do
   User.first.update_attribute(:first_name, "something")
   ActiveRecord::Base.transaction do
       User.first.update_attribute(:last_name, "something")
       p ActiveRecord::Base.connection.open_transactions
   end
end


  (0.3ms)  BEGIN
  User Load (0.8ms)  SELECT "users".* FROM "users" LIMIT 1
  (0.8ms)  UPDATE "users" SET "first_name" = 'something', "updated_at" = '2013-11-20 18:33:52.254088' WHERE "users"."id" = 1
  User Load (0.5ms)  SELECT "users".* FROM "users" LIMIT 1
  (0.4ms)  UPDATE "users" SET "last_name" = 'something', "updated_at" = '2013-11-20 18:33:52.266976' WHERE "users"."id" = 1
  1
  (14.2ms)  COMMIT
  => 1 

Ruby-on-rails相关问答推荐

GO AES GCM加密在解密时出错&S

在Rails中,如何将帮助器方法添加到属性/列?

为什么是 json.partial!使用新的哈希语法传递本地时,jbuiler 模板中的行不执行?

Rails 7.0.4 和 link_to 的数据确认不起作用

将 defer 属性添加到 javascript_include_tag Rails

如何在 Rails 上生成 AuthenticityToken

HABTM 关系 - 如何根据关联模型的属性找到记录

可能在rails中有多态has_one关系?

如果缺少翻译,则回退到默认语言

设计自定义路由和登录页面

Ruby on Rails 中的MySQL 服务器已经消失

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

如何检测导致 Rake 中的弃用警告的原因

Heroku - 在浏览器中显示当前提交的哈希

如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

设计:为什么我的注销链接不起作用?

让 bundler 为不同的平台使用不同的 gem

如何为 Rails 控制器添加延迟以进行测试?

在 Rails 中显示主机名和数据库名