多线程模式下的SQLite3:执行到底不安全
sqlite3 in multi-thread mode: what exactly is unsafe to perform?
从SQLite文档关于多线程的文章中,我得到在多线程模式下"SQLite可以被多个线程安全地使用,前提是没有单个数据库连接同时在两个或多个线程中使用"。
不过它没有解释:在这种模式下,在两个或多个线程中同时执行哪些操作是不安全的?除了明显的创建、插入、更新、删除等查询修改数据库,
- 同时执行 SELECT 是否也不安全?
那么使用语句(sqlite3_stmt)呢?如果它们与同一个数据库连接,同时使用它们是否也不安全?特别是:
- 准备报表 (sqlite3_prepare_v2)
- 绑定值 (sqlite3_bind*)
- 清除绑定 (sqlite3_clear_bindings)
- 重置语句 (sqlite3_reset)
- 在不同线程(sqlite3_open_v2、sqlite3_close_v2)中打开/关闭与同一数据库的新连接
根据我的理解,在多线程模式下,同时从两个或多个线程对sqlite3
对象进行的任何操作都是危险的。这同样适用于sqlite3_stmt
对象,因为它们是sqlite3
对象的"一部分"。
但是,您可以(并且通常确实)具有到同一数据库的多个sqlite3
连接,即使在不同的进程中也是如此。SQLite将管理它们之间的并发性。
相关文章:
- 如何执行不区分大小写的字符串比较?
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 问:Apache Arrow 数组生成器不安全追加
- 不安全的 MPI 非阻塞通信示例?
- 具有管理员权限的外壳执行不会结束
- 有没有一种简单的方法来检查C++中的不安全表达式
- 为什么静态向下转换unique_ptr不安全?
- 哪些整数操作不安全
- 删除单个构造会导致执行不正确
- 为什么这个递归 lambda 函数不安全?
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- 正在匹配不安全的正则线程
- 如何修复编译错误"此函数或变量可能不安全"(strcpy)
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 实现没有不安全服务器凭据的自定义 AuthMetadataProcessor
- 什么时候关闭__strict_ansi__标志是不安全的
- 原子对象在普通对象安全的任何上下文中都是不安全的
- OpenSSL:将不安全的BIO提升为安全
- 这是对支撑初始器列表的不安全使用情况
- 多线程模式下的SQLite3:执行到底不安全