mysql - 如何判断是否已经在 ruby​​ on rails 的数据库事务中?

标签 mysql ruby-on-rails ruby activerecord transactions

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/

相关文章:

mysql - 'undo' 或 'cancel' dockerfile VOLUME 在注册表中共享 mysql 数据库

mysql - R:RMariaDB 不适用于 3.4.0 - 如何从 R v 3.4.0 连接到 MySQL?

sql - Ruby on Rails : writing a migration to move a column to another table, 合并重复项,然后匹配 ID

ruby-on-rails - heroku 上的多线程 ruby​​ worker

html - 你能在 SASS/SCSS CSS 中使用多个条件吗

ruby - GitHub 喜欢搜索正则表达式

php - 使用php使用jquery和mysql更新表记录

php - Rails-like 使用 PHP 转义 javascript

ruby - 在 haml & serve 中,重复元素或 block 数次

php - 为什么这个 PHP-MySQL 代码不能正常工作?