sqlite3 ruby 拡張機能でデッドロックを見つけたので、ここで修正します。試してみて、これで問題が解決するかどうかを確認してください。
https://github.com/dxj19831029/sqlite3-ruby
プルリクエストを開きましたが、彼らからの応答はもうありません。
とにかく、sqlite3 自体で説明されているように、何らかのビジー例外が予想されます。
この状態に注意してください: sqlite ビジー
ビジー ハンドラーが存在しても、それが呼び出されることは保証されません。
ロック競合。SQLite がビジー ハンドラーを呼び出すとエラーが発生する可能性があると判断した場合
デッドロックの代わりに SQLITE_BUSY または SQLITE_IOERR_BLOCKED を返します。
ビジー ハンドラーを呼び出します。1 つのプロセスが読み取りロックを保持しているシナリオを考えてみましょう
予約済みロックに昇格しようとしていて、2 番目のプロセスが予約済みロックを保持していること
排他ロックに昇格しようとしているロック。最初のプロセスを続行できません
2 番目のプロセスによってブロックされ、2 番目のプロセスが続行できないためです。
最初にブロックされました。両方のプロセスがビジー ハンドラを呼び出した場合、どちらも何もしません。
進捗。したがって、SQLite は最初のプロセスに対して SQLITE_BUSY を返します。
最初のプロセスに読み取りロックを解放させ、2 番目のプロセスが
続行。
この条件を満たした場合、タイムアウトは無効になります。それを避けるために、begin/commit 内に select を置かないでください。または、begin/commit に排他ロックを使用します。
お役に立てれば。:)