sqlite:检查读/写锁

时间:2010-11-11 09:47:53

标签: c++ python sqlite

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

如何从python和c ++检查数据库是否被其他进程写入锁定?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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