当多个进程访问单个SQLite数据库文件时,如何确保正确性?
首先,避免并发访问sqlite数据库文件.并发是sqlite的弱点之一,如果你有一个高度并发的应用程序,请考虑使用另一个数据库引擎.
如果您无法避免并发或删除sqlite,请将您的写入事务包装在BEGIN IMMEDIATE;
...中END;
.sqlite中的默认事务模式是DEFERRED
指仅在第一次实际写入尝试时获取锁定.通过IMMEDIATE
事务,可以SQLITE_BUSY
立即获取锁定,或者立即获取锁定.当有人持有对数据库的锁定时,将导致其他锁定尝试SQLITE_BUSY
.
处理SQLITE_BUSY
是你必须自己决定的事情.对于许多应用程序,等待一两秒然后重试工作完全正常,n
尝试失败后放弃.有一些sqlite3 API帮助程序使这很容易,例如sqlite3_busy_handler()
,sqlite3_busy_timeout()
但也可以手动完成.
您还可以使用操作系统级别同步来获取数据库的互斥锁,或使用操作系统级别的线程间/进程间消息传递来指示一个线程何时完成访问数据库.