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()'の結果はありますか? –
いいえ、2つのトランザクションが同じリソース(この場合は@account)を要求している(したがってロックしている)ため、デッドロックが発生しています。 このようにスレッドを使用する必要がある場合は、Mutexクラスを使用して、デッドロックが発生しないようにすることをお勧めします。 (Googleのmutexとスレッドと多くの例があります)。 – grokling