【问题标题】:How to tell if already within a database transaction in ruby on rails?如何判断是否已经在 ruby​​ on rails 的数据库事务中?
【发布时间】:2013-11-20 17:18:58
【问题描述】:
ActiveRecord::Base.transaction do
  Foo.new.bar
end
Foo.new.baz

如果事务已经发生,我能否通过bar()baz() 方法以编程方式确定?寻找可能看起来像的东西 ActiveRecord::Base.within_transaction?,当从 bar()false 调用时将返回 true baz()

如果它是相关的,我正在使用带有 mysql2 gem 的 mysql 数据库,并且可以使用仅适用于 mysql 的解决方案。

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord transactions


    【解决方案1】:

    你可以使用

    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

    因此,即使您处于嵌套事务中,打开的事务数也将为 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 
    

    【讨论】:

    • 如果您的代码在config.use_transactional_fixtures = true 的测试中运行,那么您的交易是否更深? C-;
    • 如果嵌套事务有ActiveRecord::Base.transaction(requires_new: true),那么 open_transactions 将是两个而不是一个。请参阅 here 了解为什么 requires_newjoinable: false 可能实际上是可取的。
    【解决方案2】:

    在 Rails 6.0 中,您可以使用:

    ActiveRecord::Base.connection.transaction_open?
    

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2014-09-10
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多