ActiveRecord::Base.transaction do
Foo.new.bar
end
Foo.new.baz
如果事务已经发生,我可以通过 bar()
或 baz()
方法以编程方式确定吗?寻找可能看起来像的东西
ActiveRecord::Base.within_transaction?
,当从 bar()
调用时返回 true
,调用时返回 false
对于 baz()
.
如果相关,我正在使用带有 mysql2 gem 的 mysql 数据库,并且可以使用仅适用于 mysql 的解决方案。
最佳答案
你可以使用
ActiveRecord::Base.connection.open_transactions
查看您的方法是否在事务中执行。
ActiveRecord::Base.connection.open_transactions == 0
表示您的方法不在事务中执行。任何大于 0 的值都意味着您的方法在事务中执行。例如 ActiveRecord::Base.connection.open_transactions > 0
更新:
来自 Rails 文档
嵌套事务 block 中的所有数据库语句成为父事务的一部分
因此,即使您处于嵌套事务中,打开的事务数也将为 1。
这是我在控制台中得到的
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
关于mysql - 如何判断是否已经在 ruby on rails 的数据库事务中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102583/