Gibt es eine Möglichkeit, parallele Transaktionen mit RSpec zu testen? Wenn ich sage, dass ich ein Bankkonto habe, das in einer Transaktion gesperrt werden muss, bevor es verringert oder erhöht wird. Wie auch immer, obwohl ich die Option RSpec transactional_fixtures
deaktiviert habe, kann ich keine parallele Transaktion in zwei getrennten Threads starten. Aus irgendeinem Grund sind beide aufgehängt. Gegeben Konto ist ein Modell Dann ist diese Spezifikation hängen:Parallele Transaktionen mit RSpec testen
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
Gibt es eine Möglichkeit, es nicht hängen zu machen, während noch in der Lage sein, um die Fähigkeit der Transaktion zu demonstrieren?
Sagen Sie AR Cache mein 'Account.find()' Ergebnis? –
Nein. Sie erhalten einen Deadlock, weil beide Transaktionen dieselbe Ressource anfordern (und daher sperren), in diesem Fall @account. Wenn Sie auf diese Weise Threads verwenden müssen, empfehle ich die Verwendung der Mutex-Klasse, um sicherzustellen, dass Sie kein Deadlock erhalten. (Google Mutex und Threads und Sie werden viele Beispiele finden). – grokling