多线程模式下的SQLite3:执行到底不安全

sqlite3 in multi-thread mode: what exactly is unsafe to perform?

本文关键字:执行 不安全 SQLite3 模式 多线程      更新时间:2023-10-16

从SQLite文档关于多线程的文章中,我得到在多线程模式下"SQLite可以被多个线程安全地使用,前提是没有单个数据库连接同时在两个或多个线程中使用"。

不过它没有解释:在这种模式下,在两个或多个线程中同时执行哪些操作是不安全的?除了明显的创建、插入、更新、删除等查询修改数据库,

  1. 同时执行 SELECT 是否也不安全?

那么使用语句(sqlite3_stmt)呢?如果它们与同一个数据库连接,同时使用它们是否也不安全?特别是:

  1. 准备报表 (sqlite3_prepare_v2)
  2. 绑定值 (sqlite3_bind*)
  3. 清除绑定 (sqlite3_clear_bindings)
  4. 重置语句 (sqlite3_reset)
  5. 在不同线程(sqlite3_open_v2、sqlite3_close_v2)中打开/关闭与同一数据库的新连接

根据我的理解,在多线程模式下,同时从两个或多个线程对sqlite3对象进行的任何操作都是危险的。这同样适用于sqlite3_stmt对象,因为它们是sqlite3对象的"一部分"。

但是,您可以(并且通常确实)具有到同一数据库的多个sqlite3连接,即使在不同的进程中也是如此。SQLite将管理它们之间的并发性。