如果在另一个线程中进行同步,我是否会遇到sqlite的并发问题?

时间:2011-08-06 03:12:17

标签: iphone objective-c sqlite

当用户启动我的应用程序时,我想先从互联网上下载一些数据,以便与手机中的sqlite数据库同步。我在另一个线程中这样做。我知道sqlite不是线程安全的,所以不是在第二个线程中更新数据库,而是计划返回主线程,并在那里更新数据库。

如果我选择以这种方式执行此操作,这是否会阻止更新sqlite db的任何并发问题?我还应该注意其他任何问题吗?

示例:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

  //downloading data...

  dispatch_async(dispatch_get_main_queue(), ^{
     //update database here 
  }
}

1 个答案:

答案 0 :(得分:0)

通常SQLite被编译为技术上线程安全的 - 从多个线程访问不会导致数据库损坏或SQLite代码的错误行为。

但是,当您从多个线程同时访问SQLite数据库时,“失败者”线程可能会出现“数据库锁定”错误。您可以通过短暂延迟然后重试该操作来处理此问题,或者您可以围绕数据库访问实现单独的锁定协议。

如果您能以某种方式安排从同一个线程执行所有访问,则不应发生“数据库锁定”错误,并且SQLite DB应该“满意”。但是,请记住,不应在主/ UI线程中执行“长时间运行”操作,因此您不应在主线程中调度复杂查询或在一次操作中对大量记录进行操作。