データベースがロックされていることをテストしたいとします。
$transaction = Thread.new {
Rails.logger.debug 'transaction process start'
Inventory.transaction do
inventory.lock!
Thread.stop
inventory.units_available=99
inventory.save
end
}
$race_condition = Thread.new {
Rails.logger.debug 'race_condition process start'
config = ActiveRecord::Base.configurations[Rails.env].symbolize_keys
config[:flags] = 65536 | 131072 | Mysql2::Client::FOUND_ROWS
begin
connection = Mysql2::Client.new(config)
$transaction.run
$transaction.join
rescue NoMethodError
ensure
connection.close if connection
end
}
Rails.logger.debug 'main process start'
$transaction.join
Rails.logger.debug 'main process after transaction.join'
sleep 0.1 while $transaction.status!='sleep'
Rails.logger.debug 'main process after sleep'
$race_condition.join
Rails.logger.debug 'main process after race_condition.join'
理論的には、トランザクションスレッドを実行し、次にwait(Thread.stop)を実行すると、メインプロセスはスリープ状態になっていることを確認し、競合状態スレッド(ロックされたテーブルのデータを変更しようとします)を開始すると思います。それが実際に機能するとき)。次に、競合状態は、それが行われた後、トランザクションスレッドを続行します。
奇妙なのはトレースです
main process start
transaction process start
race_condition process start
nodejsから来ているので、スレッドはユーザーフレンドリーではないようです。しかし、これを行う方法が必要です。
データベースをロックしてから、別のスレッドでデータベースを変更する簡単な方法はありますか?