SQLite具有不同级别的锁:UNLOCKED
,SHARED
,RESERVED
,PENDING
,EXCLUSIVE
。
我找不到调用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
?
答案 0 :(得分:-1)
SQLite获取sqlite3_prepare
中数据库/表的锁定,并在sqlite3_finalize
中释放它。
锁的类型取决于您的SQL表达式。
因此,如果您创建了STMT - 您需要执行它并尽快完成。否则你会阻止不同的连接。
实施例:
如果您为SELECT
表达式创建了STMT,则获得SHARED
锁定。因此,在STMT完成之前,所有来自不同连接的写操作都将被阻止。