如何通过ActiveRecord从多个线程写入SQLite3?

时间:2014-02-11 14:24:23

标签: 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, ActiveRecord: SQL (5090.3ms)  INSERT INTO "actions" ..
B, ActiveRecord: SQLite3::BusyException: database is locked: INSERT INTO "actions" ...

我相信要明白发生了什么。数据库不能再保持状态,因为仍有一个事务处于打开状态。

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

我应该以不同的方式设计吗?是否有一个简单的解决方案可以在一个单独的线程中排队事务?你会建议什么?

1 个答案:

答案 0 :(得分:0)

sqlite不支持并发,你应该使用锁定或尝试使用连接规范的超时

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

然后,如果获取数据库连接需要超过15分钟,您将只获得BusyException。