【发布时间】:2014-03-09 09:29:18
【问题描述】:
我想从多个线程写入同一个 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 用于任何严肃的事情和/或生产中。真是让人头疼。
-
请告诉我其他的陷阱!
标签: ruby-on-rails multithreading activerecord sqlite