레일 위의 루비에서 데이터베이스 트랜잭션 내에 이미 있는지 확인하는 방법은 무엇입니까?
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
'programing' 카테고리의 다른 글
해시 테이블 및 키 순서 (0) | 2023.09.03 |
---|---|
가져오기-Module Web Administration이 스크립트에서 로드되지 않고 명령줄에서 로드됨 (0) | 2023.09.03 |
파이썬: mysqldb를 사용하여 MySQL 테이블을 사전으로 가져오시겠습니까? (0) | 2023.08.29 |
res.sendFile 절대 경로 (0) | 2023.08.29 |
node.js, 오류: 'express' 모듈을 찾을 수 없습니다. (0) | 2023.08.29 |