programing

레일 위의 루비에서 데이터베이스 트랜잭션 내에 이미 있는지 확인하는 방법은 무엇입니까?

muds 2023. 8. 29. 21:04
반응형

레일 위의 루비에서 데이터베이스 트랜잭션 내에 이미 있는지 확인하는 방법은 무엇입니까?

ActiveRecord::Base.transaction do
  Foo.new.bar
end
Foo.new.baz

내에서 프로그래밍 방식으로 결정할 수 있습니까?bar()또는baz()거래가 이미 진행 중인 경우 방법은 무엇입니까?같은 것을 찾고 있는 중입니다.ActiveRecord::Base.within_transaction?그것은 돌아올 것입니다.true에서 부르면bar()그리고.false요구가 있을 때baz().

만약 관련이 있다면, 나는 mysql2 gem과 함께 mysql 데이터베이스를 사용하고 있으며, mysql에만 작동하는 솔루션도 괜찮습니다.

사용할 수 있습니다.

ActiveRecord::Base.connection.open_transactions

메서드가 트랜잭션에서 실행되는지 확인합니다.

ActiveRecord::Base.connection.open_transactions == 0메서드가 트랜잭션에서 실행되지 않았음을 나타냅니다.0보다 큰 값은 메소드가 트랜잭션에서 실행되었음을 의미합니다.예를들면ActiveRecord::Base.connection.open_transactions > 0

업데이트:

레일 문서에서

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 

Rails 6.0에서는 다음을 사용할 수 있습니다.

ActiveRecord::Base.connection.transaction_open?

언급URL : https://stackoverflow.com/questions/20102583/how-to-tell-if-already-within-a-database-transaction-in-ruby-on-rails

반응형