SQLite3和锁的释放
SQLite3 and releasing of locks
SQLite具有不同级别的锁:UNLOCKED
、SHARED
、RESERVED
、PENDING
、EXCLUSIVE
。
我找不到调用SQLite API获取和释放锁的信息。
据我所知,sqlite3_step
调用时获取了锁。锁的类型取决于prepared语句的表达式。此外,此命令还可以在自定义事务中升级写操作中的锁定。
据我所知,写锁也是由sqlite3_step释放的——这个函数返回SQLITE_DONE
或错误代码。我没有找到任何文档,但这个函数应该在执行结束时发布RESERVED
/PENDING
/EXCLUSIVE
,这似乎是合理的。
但我不明白读取操作会发生什么。要获得所有查询的行,我们需要多次调用sqlite3_step
——每次调用都会给我们一行。
我从Unlock-notify API找到了关于操作系统缓存和引用的SQLite文档:it is not possible for one call to sqlite3_step() to return SQLITE_ROW and then the next SQLITE_LOCKED
我假设在读取操作中,对sqlite3_step
的第一次调用获取SHARED
锁并将数据从文件加载到操作系统缓存。如果sqlite3_step
返回除SQLITE_ROW
以外的任何内容(即SQLITE_DONE
或错误代码),则释放锁定。
对吗?
如何手动释放获取的锁进行读取操作?sqlite3_reset
?
SQLite在sqlite3_prepare
中获取数据库/表的锁,并在sqlite3_finalize
中释放它。锁的类型取决于您的SQL表达式。
因此,如果你创建了一个STMT,你需要尽快执行它并完成。否则会阻塞不同的连接。
示例:如果为SELECT
表达式创建STMT,则获得了SHARED
锁。因此,来自不同连接的所有写入操作都被阻止,直到STMT完成。
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 无法在windows上使用mingw将sqlite3与c连接
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- sqlite3 和生成文件中的链接出现问题
- 使用全局声明的向量时,C++双重释放错误/损坏
- 如何在 sqlite3 中的表中添加整数列表
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- SQLite3和锁的释放