SQLite3和锁的释放

SQLite3 and releasing of locks

本文关键字:释放 SQLite3      更新时间:2023-10-16

SQLite具有不同级别的锁:UNLOCKEDSHAREDRESERVEDPENDINGEXCLUSIVE

我找不到调用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完成。