ActiveRecord::Base.transaction do
Foo.new.bar
end
Foo.new.baz
我能否从bar()
或baz()
方法中通过编程确定事务是否已经发生?寻找可能看起来像
如果相关的话,我使用的是mysql数据库和mysql2 gem,我可以使用一个只适用于mysql的解决方案.
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