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

Bir işlem zaten gerçekleşiyorsa, program aracılığıyla bar() veya baz() yöntemlerinden belirleyebilir miyim? ActiveRecord::Base.within_transaction? gibi görünebilecek bir şey arıyorsanız, true numaralı telefona bar() ve false çağrılırken baz() çağrılır. durumdaZaten raylarda ruby ​​içinde bir veritabanı işleminde olup olmadığını nasıl anlarım?

ben mysql2 gem ile mysql veritabanı kullanarak ve sadece MySQL için çalışan bir çözüm ile Tamam değilim ediyorum alakalıdır.

cevap

30

Sen yöntem işlemde çalıştırılan olup olmadığını görmek için

ActiveRecord::Base.connection.open_transactions 

kullanabilirsiniz.

ActiveRecord::Base.connection.open_transactions == 0

yönteminiz bir işlemde yürütülür olmadığını ima eder. 0'dan büyük bir şey, yönteminizin bir işlemde gerçekleştirildiğini ima eder. Örneğin ActiveRecord::Base.connection.open_transactions > 0

Güncelleme için: raylar belgelerinden

all database statements in the nested transaction block become part of the parent transaction

Yani açık işlem sayısı iç içe geçmiş bir işlemde bile biri olacak.

Bu benim konsola

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

var ve kod 'config.use_transactional_fixtures = TRUE ile bir testte çalışıyorsa, o zaman sana bir işlem daha derin ne olduğunu? C-'dir; – Phlip

+1

@Phlip: Umarım güncellemenin sorunuzu yanıtlamasını beklerim – usha

İlgili konular