当多个进程访问同一个SQLite数据库文件时,如何保证正确性?
首先,避免并发访问sqlite数据库文件。并发性是 sqlite 的弱点之一,如果您有高度并发的应用程序,请考虑使用其他数据库引擎。
如果您无法避免并发或删除 sqlite,请包装您的write交易于BEGIN IMMEDIATE;
... END;
。 sqlite中默认的事务模式是DEFERRED
这意味着仅在第一次实际写入尝试时获取锁。和IMMEDIATE
事务,立即获取锁,或者你得到SQLITE_BUSY
立即地。当某人持有数据库锁时,其他锁定尝试将导致SQLITE_BUSY
.
处理SQLITE_BUSY
是你必须自己决定的事情。对于许多应用程序来说,等待一两秒然后重试就可以了,之后就放弃n
失败的尝试。有 sqlite3 API 帮助程序可以使这变得简单,例如sqlite3_busy_handler()
and sqlite3_busy_timeout()
但也可以手动完成。
您还可以使用操作系统级别同步来获取数据库的互斥锁,或者使用操作系统级别线程间/进程间消息传递在一个线程完成访问数据库时发出信号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)