我正在开发一个使用sqlite数据库的iPhone应用程序。该应用程序以后台线程的形式从互联网上下载数据,UI位于主线程中。后台下载线程可以在数据库上执行插入、更新和选择。UI层还可以通过执行更新和选择来与数据库交互。如果在后台线程下载时我没有大量地与UI交互,那么一切都会正常工作。但是,当下载过程中在主(UI)线程上执行大量更新时,我开始遇到问题。
在每次对数据库查询时,我都使用@synchronized语句,但这并不能解决问题。当查询(从UI和后台线程)同时执行时,会导致数据丢失。在主线程中更新数据也像在后台一样执行得很好(如果它们彼此独立执行)。
数据库有sqlite3_threadsafe() == 2;对于所有查询,我使用了一个连接,问题可能隐藏在这个连接中?
发布于 2018-05-06 02:44:49
根据the docs,您应该调用sqlite3_config()函数并选择线程模型。我建议先试试SQLITE_CONFIG_SERIALIZED。
还要确保没有在sqlite3_open_v2()中使用SQLITE_OPEN_NOMUTEX标志。
通常,一种好的做法是将所有写操作序列化到单个线程。一种“一个作者-多个读者”的模式。我建议甚至避免所有来自主线程的DB访问,尽管这可能会很复杂,这取决于您拥有的遗留代码的数量。
发布于 2018-05-06 03:48:02
SQLite的线程模式仅保护单个函数调用。但是,每个连接都有一个事务,所以如果有多个线程同时访问数据库,它们仍然会相互干扰。您应该改用多个连接。
如果你想同时读写,可以考虑使用WAL mode。
https://stackoverflow.com/questions/50189757
复制相似问题