RSpec을 사용하여 병렬 트랜잭션을 테스트 할 수있는 방법이 있습니까? 은행 계좌 잔고가 줄어들거나 증가하기 전에 거래 내에서 잠겨 야한다고 말한 경우 그러나 현재 RSpec transactional_fixtures
옵션을 해제했지만 2 개의 분리 된 스레드에서 2 개의 병렬 트랜잭션을 시작할 수 없습니다. 웬일인지, 양쪽 다 매달린다. 감안할 때 계정 모델 다음이 사양이 중단됩니다입니다 : 여전히 거래의 능력을 입증 할 수있는 동안은 끊지 할 수있는 방법이RSpec을 사용하여 병렬 트랜잭션 테스트
it "should ensure operations are performed correctly" do
@account = Account.create(:balance => 0)
threads = []
(0..1).each do |index|
threads << Thread.new do
Account.transaction do
account = Account.find(@account.id, :lock => true)
account.balance += 100
sleep 0.5
account.save!
end
end
end
threads.each{|t|t.join}
@account.reload.balance.should == 200
end
있습니까?
AR 캐시 내 Account.find() 결과입니까? –
아니요. 두 트랜잭션이 모두 동일한 리소스 (이 경우 @account)를 요청하고 (따라서 잠그고 있기 때문에) 교착 상태에 빠졌습니다. 이런 식으로 쓰레드를 사용해야한다면 Mutex 클래스를 사용하여 교착 상태가 발생하지 않도록하는 것이 좋습니다. (Google 뮤텍스 및 스레드 및 많은 예제를 찾을 수 있습니다.) – grokling