複数のスレッドを生成し、各スレッドでデータベースを更新する必要があるアプリケーションがあります。スレッドを 1 つだけ作成して更新を連続して実行すると、すべて問題ありませんが、マルチスレッドを実行しようとすると、ログに次のエラーが記録されます。
SQLite3::SQLException: SQL ロジック エラーまたはデータベースがありません: ロールバック トランザクションおよび SQLite3::BusyException: データベースがロックされています
ロックは最初のエラーが原因だと思います。
問題を引き起こすコードは次のとおりです。
all_threads = []
servers.each do |server|
all_threads << Thread.new(server) do |svr|
serverCurrent = Server.find(svr.id)
serverCurrent.state = 3
serverCurrent.save
end
end
all_threads.each(&:join)
スレッド内でサーバーをループすると (スレッドが 1 つだけ作成され、すべて問題ありません)。私が使用しているデータベースはSQLite3です