SQLITE3 CLSQL多线程插入导致错误

时间:2015-07-09 18:17:16

标签: multithreading common-lisp clsql

我想在多个线程并行使用我的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数据库进行多线程插入吗?如果是的话怎么样?

1 个答案:

答案 0 :(得分:4)

SQLite不支持多个写入事务的并发性。来自SQlite site

  

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

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

因此,如果您需要并发插入数据库,则应使用其他内容,例如PostgreSQL

相关问题