【问题标题】:How to write to SQLite3 from multiple thread through ActiveRecord?如何通过 ActiveRecord 从多线程写入 SQLite3?
【发布时间】: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


【解决方案1】:

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

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

那么只有在获取数据库连接的时间超过 15 分钟时才会收到 BusyException。

【讨论】:

  • 15000 毫秒是 15 秒。我已经设置了 5 秒的超时时间,这已经足够了,因为它目前只有一条记录。我知道SQLite不支持并发,但是这不应该发生,会发生什么,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多