在我的应用程序中,需要在异步任务中调用多个 Web 服务,并在每次响应时将大数据插入数据库中的不同表中,对于每个表快速插入,我通过开始和结束事务锁定数据库。问题出在所有网络服务之后,如果我尝试插入新记录,日志显示失败 5(数据库已锁定)。我检查了数据库是否被 inTransaction()、isDbLockedByOtherThreads 和 isDbLockedByCurrentThread 锁定。全部返回假。
如何解决这个问题。
Sqlite 不允许并发写入,默认情况下,当写入正在进行时,尝试启动另一个事务将失败并出现此错误。在 C API 中,有一个函数可以让它在set_busy_timeout
指定时间()之间的短暂睡眠重复重试,但我在 Android Java 包装器中没有看到类似的 API,所以你可能不得不处理重试这个错误自己。
还要确保在所有可能的错误条件下正确提交或回滚所有事务(没有显式事务完成所有语句)。
isDbLockedByOtherThreads
返回可能是因为其他事务false
在您调用它之前完成,或者仅在您调用它之后才开始,或者仅仅是因为它并不真正知道,因为我不知道有任何函数可以在 C 级别进行此检查。
如果您想修改一个表并且有一个未完成的语句引用它,也会发生类似的错误,但这是状态 6(表已锁定)。