我想在多个线程并行使用我的sqlite3数据库。我读到使用连接池使访问线程安全,但插入数据时仍然会出错。
(make-thread
#'(lambda()
(dotimes (i 100)
(with-database (db ("/path/to/db")
:database-type :sqlite3 :pool T)
(do-stuff-with db)))))
在此错误中以这种方式使用多个线程时
访问数据库时# 表达" INSERT INTO ...": 错误5 /数据库已锁定
甚至可以使用sqlite3数据库进行多线程插入吗?如果是的话怎么样?
答案 0 :(得分:4)
SQLite不支持多个写入事务的并发性。来自SQlite site:
SQLite支持无限数量的同时阅读器,但它只允许一个编写者在任何时刻。在许多情况下,这不是问题。作家排队。每个应用程序都可以快速完成数据库的工作并继续运行,并且锁定持续时间超过几十毫秒。但是有些应用程序需要更多的并发性,而这些应用程序可能需要寻求不同的解决方案。
已经编写了Cl-sql,为典型的客户端 - 服务器关系DBMS提供“统一”接口,就像其他“标准化”库(例如JDBC或ODBC)一样,但SQLite是一个“非典型”的数据库管理系统:实践它是一个库,它提供SQL作为语言来访问简单的“数据库中的文件”,以及DBMS的一些其他功能。例如,它没有真正的并发控制(它使用操作系统函数来锁定db文件),因此它不能被视为“真正的”DBMS,并且cl-sql不能提供底层系统的功能。
因此,如果您需要并发插入数据库,则应使用其他内容,例如PostgreSQL。