sqlite:检查读/写锁

Posted

技术标签:

【中文标题】sqlite:检查读/写锁【英文标题】:sqlite: check reader/writer lock 【发布时间】:2011-05-08 08:59:32 【问题描述】:

我有 2 个进程都访问 sqlite3 数据库。虽然在 sqlite 中读取不是问题,但只有一个进程可以写入数据库。根据常见问题解答: http://www.sqlite.org/faq.html#q5 sqlite 使用读/写锁。

我如何检查数据库是否被另一个进程锁定以进行写入,无论是来自 python 还是 c++?

[编辑] 我的意思是执行查询是一种选择,但它的性能取决于查询。所以问题也是我使用什么类型的查询来最小化这种影响。我也想自己锁定/解锁数据库。

【问题讨论】:

【参考方案1】:

当 SQLite 尝试访问锁定的数据库时,它的默认行为是返回 SQLITE_BUSY。文档描述了向此事件添加自定义处理的方法:http://www.sqlite.org/faq.html#q5。

我从文档中了解到,您调用的任何尝试写入此锁定数据库的函数都只会返回 SQLITE_BUSY,这将通知您数据库已锁定。

如果您担心执行无法完成的写入,您可以结合繁忙超时 (sqlite3_busy_timeout) 实现繁忙处理程序回调 (sqlite3_busy_handler),这将在 x 毫秒后重试写入。

[edit] 在http://www.sqlite.org/c3ref/io_methods.html 中,它提到了一个函数指针结构,其中之一是xCheckReservedLock(),如果文件被锁定,它会返回true。在这个结构中是所有其他与锁相关的功能。我不确定是否可以从 sqlite 库外部访问这些,但可能值得研究。我想你是通过这个界面来做的:http://www.sqlite.org/c3ref/file_control.html

【讨论】:

我实际上链接到我的问题中的常见问题解答。我仍然想知道的是如何检查数据库是否被锁定。我的意思是执行查询是一种选择,但它的性能取决于查询。所以问题也是我使用什么类型的查询来最小化这种影响。我也想自己锁定/解锁数据库。我可能应该在这个问题上更清楚。 在sqlite.org/c3ref/io_methods.html 中,它提到了一个函数指针结构,其中一个是xCheckReservedLock(),如果文件被锁定,它会返回true。在这个结构中是所有其他与锁相关的功能。我不确定是否可以从 sqlite 库外部访问这些,但可能值得研究。我想你是通过这个界面来做的:sqlite.org/c3ref/file_control.html

以上是关于sqlite:检查读/写锁的主要内容,如果未能解决你的问题,请参考以下文章

无法使用可读格式的 JavaScript 读取 IndexedDB sqlite 文件

如何将 sqlite 文件中的 blob 数据读取为可读格式?

java Android中的SQLite数据库创建和数据库读/写操作。

java Android中的SQLite数据库创建和数据库读/写操作。

SQLite 不检查数据类型

检查查询是不是在 Android 的 sqlite 中成功