Тестирование параллельных транзакций с использованием RSpec - PullRequest
1 голос
/ 13 января 2011

Есть ли способ протестировать параллельные транзакции с использованием RSpec?Например, у меня есть остаток на банковском счете, который необходимо заблокировать внутри транзакции, прежде чем он будет уменьшен или увеличен.Однако в настоящее время, хотя я отключил параметр RSpec transactional_fixtures, я не могу запустить 2 параллельные транзакции в двух отдельных потоках.Почему-то оба повешены.Данная учетная запись является моделью. Затем эта спецификация будет зависать:

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

Есть ли способ заставить ее не зависать, пока еще можно продемонстрировать способность транзакции?

Ответы [ 2 ]

1 голос
/ 23 декабря 2013

Вам нужно использовать разные соединения с базой данных в ваших темах. Сначала отключите основной поток, затем повторно подключите каждый поток и, наконец, подключите главный, как показано ниже:

ActiveRecord::Base.connection.disconnect!
(0..1).each do |index|
  threads << Thread.new do
    ActiveRecord::Base.establish_connection
    # ...
  end
end
ActiveRecord::Base.establish_connection

Существуют и другие проблемы при тестировании таким образом: у вас нет гарантии того, что произойдет параллелизм. Рубин Гил тоже не поможет. Вы должны использовать вилки вместо потоков или использовать gem fork_break: https://github.com/remen/fork_break

0 голосов
/ 29 марта 2011

Я не могу придумать вескую причину, почему вы хотели бы иметь параллельные, параллельные транзакции на одном и том же ресурсе. Чего именно вы пытаетесь достичь в своем примере?

В вашем коде вы используете один и тот же экземпляр, поэтому ожидается, что вы зашли в тупик. Вы, вероятно, хотите переосмыслить то, что вы пытаетесь сделать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...