2

我想将我的 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 数据库进行多线程插入吗?如果是怎么办?

4

1 回答 1

4

SQLite 不支持多个写入事务的并发。从 SQlite网站

SQLite 支持无限数量的同时读取器,但它在任何时刻只允许一个写入器。对于许多情况,这不是问题。作家排队。每个应用程序都快速完成其数据库工作并继续前进,没有任何锁定持续超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案。

Cl-sql 被编写来为典型的客户端-服务器关系 DBMS 提供一个“统一”接口,就像其他“标准化”库(例如 JDBC 或 ODBC)一样,但 SQLite 是一个“非典型”数据库管理系统:实际上它是一个库,它提供 SQL 作为语言来访问简单的“文件中的数据库”,以及 DBMS 的一些其他功能。例如,它没有真正的并发控制(它使用操作系统函数来锁定 db 文件),因此不能将其视为“真正的”DBMS,而 cl-sql 只能提供底层系统的功能。

因此,如果您需要并发插入数据库,您应该使用其他东西,例如PostgreSQL

于 2015-07-09T20:52:11.497 回答