SQLite:检查读/写锁

3
我有两个进程都要访问一个SQLite3数据库。在SQLite中,读取不是问题,但只有一个进程能够写入数据库。根据FAQ:http://www.sqlite.org/faq.html#q5,SQLite使用读者/写者锁。
我如何检查数据库是否被另一个进程锁定以进行写操作,无论是从Python还是C ++?
[编辑] 我的意思是执行查询是一种选择,但这会影响性能。因此,问题也是我使用什么类型的查询来最小化这种影响。我还想自己锁定/解锁数据库。
1个回答

2
当SQLite尝试访问被锁定的数据库时,默认行为是返回SQLITE_BUSY。文档描述了添加自定义处理此事件的方法:http://www.sqlite.org/faq.html#q5
从文档中我了解到,任何尝试写入此锁定数据库的函数都将简单地返回SQLITE_BUSY,并且这将是您发现数据库已锁定的通知。
如果您担心执行的写入不会完成,您可以实现一个繁忙处理程序回调(sqlite3_busy_handler),并与繁忙超时(sqlite3_busy_timeout)一起使用,在x毫秒后重试写入。
http://www.sqlite.org/c3ref/io_methods.html中,它提到了一个函数指针结构体,在其中一个函数是xCheckReservedLock(),如果文件被锁定则返回true。在这个结构体中,还有所有其他锁相关的函数。我不确定是否可以从sqlite库外部访问它们,但值得调查一下。我认为你可以通过这个接口来做:http://www.sqlite.org/c3ref/file_control.html

我在我的问题中实际上已经链接到了常见问题解答。但我仍然想知道如何检查数据库是否被锁定。我的意思是执行查询是一种选择,但它会影响性能,具体取决于查询的类型。因此,问题也是我应该使用什么类型的查询来最小化这种影响。我还想自己锁定/解锁数据库。我可能在问题中表述得不够清楚。 - scigor
在http://www.sqlite.org/c3ref/io_methods.html中,它提到了一个函数指针结构体,其中之一是xCheckReservedLock(),如果文件被锁定,则返回true。在这个结构体中,所有其他与锁有关的函数都包含在内。我不确定是否可以从sqlite库外部访问它们,但值得调查一下。我认为你可以通过这个接口来实现:http://www.sqlite.org/c3ref/file_control.html - badgerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接