1

複数のスレッドを生成し、各スレッドでデータベースを更新する必要があるアプリケーションがあります。スレッドを 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です

4

1 に答える 1