2013-11-20 68 views
21
ActiveRecord::Base.transaction do 
    Foo.new.bar 
end 
Foo.new.baz 

如果交易已經發生,我可以從bar()baz()方法中以編程方式確定嗎?尋找可能看起來像 ActiveRecord::Base.within_transaction?的東西,當從bar()調用時將返回true,當調用baz()時調用false如何判斷在rails上的ruby中是否已有數據庫事務?

如果它是相關的,我使用的是mysql2 gem的mysql數據庫,並且只適用於mysql的解決方案。

回答

30

您可以使用

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 
+0

了,如果你的代碼在'config.use_transactional_fixtures = TRUE'測試運行,那麼你是一個交易更深? C-; – Phlip

+1

@Phlip:我希望我的更新能夠回答你的問題 – usha

相關問題