我正在使用一个使用sqlite数据库的iPhone应用程序。该应用程序在后台线程中使用主线程中的UI下载Internet数据。后台下载线程可以在数据库上执行INSERT,UPDATE和SELECT。 UI层还可以通过执行UPDATE和SELECT与数据库交互。如果我在下载后台线程时没有与UI进行大量交互,那么一切正常。但是,在下载过程中执行主(UI)线程上的大量UPDATE时,我开始遇到问题。
在每次查询数据库时,我都使用@synchronized语句,但它并没有解决问题。当查询(来自UI和来自后台线程)同时执行时,它会导致数据丢失。更新主线程中的数据也可以在背景中执行(如果它们彼此分开执行)。
数据库有sqlite3_threadsafe()== 2; 对于所有查询我使用一个连接可能有问题隐藏在这个?
答案 0 :(得分:1)
根据the docs,您应该调用sqlite3_config()
函数并选择一个线程模型。我建议先尝试SQLITE_CONFIG_SERIALIZED。
另外,请确保您没有使用SQLITE_OPEN_NOMUTEX标记sqlite3_open_v2()
。
通常,一个好的做法是将所有写入序列化到单个线程。有一种作家 - 很多读者"模型。我建议甚至避免来自主线程的所有数据库访问,尽管这可能很复杂,具体取决于您拥有的遗留代码的数量。
答案 1 :(得分:0)
SQLite的线程模式仅保护单个函数调用。但是,每个连接都有一个事务,因此如果您有多个线程同时访问数据库,它们仍然会相互干扰。 您应该使用多个连接。
如果您想同时阅读和书写,请考虑使用WAL mode。