首先,避免并发访问sqlite数据库文件.并发是sqlite的一个弱点,如果你有一个高度并发的应用程序,请考虑使用另一个数据库引擎.
如果您无法避免并发或丢弃sqlite,请将您的写入事务封装在BEGIN IMMEDIATE中; … 结束;. sqlite中的默认事务模式为DEFERRED,这意味着仅在第一次实际写入尝试时才获取锁定.使用IMMEDIATE事务,锁将立即获取,或者立即获得sqlITE_BUSY.当有人持有对数据库的锁定时,其他锁定尝试将导致sqlITE_BUSY.
处理sqlITE_BUSY是你自己决定的.对于许多应用程序,等待一秒或两秒,然后重试正常工作,在n次尝试失败后放弃.有sqlite3 API帮助者使这样很容易,例如sqlite3_busy_handler()和sqlite3_busy_timeout(),但它也可以手动完成.
您还可以使用操作系统级同步来获取数据库的互斥锁,或者使用操作系统层级的跨线程/进程间消息传递来在一个线程完成访问数据库时发出信号.