我想从多个线程写入同一个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" ...
我相信要明白发生了什么。数据库不能再保持状态,因为仍有一个事务处于打开状态。
我如何确保一次只能打开一个交易?也许有一个解决方案,我不必每次开始新的交易时都检查这个。
我应该以不同的方式设计吗?是否有一个简单的解决方案可以在一个单独的线程中排队事务?你会建议什么?
答案 0 :(得分:0)
sqlite不支持并发,你应该使用锁定或尝试使用连接规范的超时
dev_sqlite:
adapter: sqlite3
dbfile: db/dev.db
timeout: 15000
然后,如果获取数据库连接需要超过15分钟,您将只获得BusyException。