我想使用带有多个并行线程的 sqlite3 数据库。我读到使用连接池可以使访问线程安全,但在插入数据时仍然出现错误。
(make-thread
#'(lambda()
(dotimes (i 100)
(with-database (db ("/path/to/db")
:database-type :sqlite3 :pool T)
(do-stuff-with db)))))
在此错误中以这种方式使用多个线程时
While accessing database # with expression "INSERT INTO ...": Error 5 / database is locked
是否可以使用 sqlite3 数据库进行多线程插入?如果是的话怎么办?
最佳答案
SQLite 不支持多个写入事务的并发。来自 SQlite site :
SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time. For many situations, this is not a problem. Writer queue up. Each application does its database work quickly and moves on, and no lock lasts for more than a few dozen milliseconds. But there are some applications that require more concurrency, and those applications may need to seek a different solution.
Cl-sql 的编写目的是为典型的客户端-服务器关系 DBMS 提供“统一”接口(interface),就像其他“标准化”库(例如 JDBC 或 ODBC)一样,但 SQLite 是一个“非典型”数据库管理系统: Practice it 是一个库,提供 SQL 作为语言来访问简单的“文件中的数据库”以及 DBMS 的一些其他功能。例如,它没有真正的并发控制(它使用操作系统功能来锁定数据库文件),因此它不能被视为“真正的”DBMS,并且 cl-sql 只能提供底层系统的功能。
因此,如果您需要并发插入数据库,您应该使用其他内容,例如 PostgreSQL .
关于multithreading - SQLITE3 CLSQL多线程插入导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325248/