SQLite3和释放锁

时间:2016-04-02 09:44:39

标签: c++ windows sqlite locking

SQLite具有不同级别的锁:UNLOCKEDSHAREDRESERVEDPENDINGEXCLUSIVE

我找不到调用SQLite API获取和释放锁定的信息。

据我所知,当sqlite3_step被调用时获取了锁。锁的类型取决于预准备语句的表达。此命令还可以升级自定义事务内的写入操作中的锁定。

据我所知,sqlite3_step也发布了写锁定 - 这个func返回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锁并将数据从文件加载到OS缓存。如果sqlite3_step返回SQLITE_ROW以外的任何内容(即SQLITE_DONE或错误代码),则会锁定已解除。

是不是?

我们如何手动释放获取的锁定以进行读取操作? sqlite3_reset

1 个答案:

答案 0 :(得分:-1)

SQLite获取sqlite3_prepare中数据库/表的锁定,并在sqlite3_finalize中释放它。 锁的类型取决于您的SQL表达式。

因此,如果您创建了STMT - 您需要执行它并尽快完成。否则你会阻止不同的连接。

实施例: 如果您为SELECT表达式创建了STMT,则获得SHARED锁定。因此,在STMT完成之前,所有来自不同连接的写操作都将被阻止。