比方說,我們要測試數據庫被鎖定..Rails的線程測試分貝鎖定
$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'
從理論上講,我認爲它會做的交易線索,然後等待(使用Thread.stop) ,那麼主進程會看到它正在休眠,並啓動競態條件線程(當實際工作時它將嘗試更改鎖定表中的數據)。然後競爭條件在完成後繼續交易線程。
有什麼奇怪的是跟蹤
main process start
transaction process start
race_condition process start
從即將的NodeJS,好像線程不是完全按照用戶友好的..但是,必須有完成這件事的方式。
是否有更簡單的方法來鎖定數據庫,然後嘗試使用不同的線程更改它?
見我的答案和評分,如果它幫助!乾杯:) – uday