Ruby on rails 如何通过ActiveRecord从多线程写入SQLite3?

Ruby on rails 如何通过ActiveRecord从多线程写入SQLite3?,ruby-on-rails,multithreading,activerecord,sqlite,Ruby On Rails,Multithreading,Activerecord,Sqlite,我想从多个线程写入同一个SQLite3表,这会引发一个异常,即: A, ActiveRecord: (0.2ms) begin transaction B, ActiveRecord: (0.1ms) begin transaction A, ActiveRecord: SQL (0.6ms) INSERT INTO "actions" .. A, ActiveRecord: (46.6ms) commit transaction B, Ac

我想从多个线程写入同一个SQLite3表,这会引发一个异常,即:

A, ActiveRecord:     (0.2ms)     begin transaction
B, ActiveRecord:     (0.1ms)     begin transaction
A, ActiveRecord: SQL (0.6ms)     INSERT INTO "actions" ..
A, ActiveRecord:     (46.6ms)    commit transaction
B, ActiveRecord: SQL (5090.3ms)  INSERT INTO "actions" ..
B, ActiveRecord: SQLite3::BusyException: database is locked: INSERT INTO "actions" ...
我相信我能理解发生了什么。由于仍有一个事务处于打开状态,数据库无法再保持其“外观”状态

如何确保一次只打开一个交易?也许有一个解决方案,我不必每次开始新的事务时都检查它


我应该用不同的设计吗?有没有一个简单的解决方案可以在一个单独的线程中对事务进行排队?您有什么建议?

sqlite不支持并发,您应该在连接规范上使用锁定或超时

dev_sqlite:
  adapter: sqlite3
  dbfile: db/dev.db
  timeout: 15000

然后,如果需要15分钟以上才能连接到数据库,则只会出现BusyException。

有趣的问题,如果有人会问这个问题,那就好了。不要在任何严肃和/或生产中使用SQLite。真让人讨厌。请告诉我其他的陷阱!15000毫秒是15秒。我已经设置了5秒的超时时间,这已经足够了,因为现在只有一个记录。我知道SQLite不支持并发,但这不应该发生,会发生什么,对吗?