进程间SQLite线程安全(在iOS上)

Nat*_*ate 9 sqlite thread-safety jailbreak ios

我正在尝试确定我的sqlite访问数据库是否在iOS上是线程安全的.我正在编写一个非App Store应用程序(或可能是一个启动守护程序),因此Apple的批准不是问题.有问题的数据库是内置的sms.db,因此操作系统也可以访问此数据库进行读写.我只想安全地阅读它.

我已经阅读过有关使用sqlite从多个进程读取的内容:

多个进程可以同时打开同一个数据库.多个进程可以同时执行SELECT.但是,只有一个进程可以随时对数据库进行更改.

我知道线程安全性可以用sqlite编译,并且sqlite3_threadsafe()可以用来测试它.在iOS 5.0.1上运行此功能

int safe = sqlite3_threadsafe();
Run Code Online (Sandbox Code Playgroud)

产生的2的结果 根据本,这意味着互斥锁定是可用的.但是,这并不一定意味着它正在使用中.

我不清楚是否在每个连接,每个数据库或全局基础上动态启用了线程安全性.

我也读过这个.它看起来sqlite3_config()可用于启用安全的多线程,但当然,我无法控制或了解操作系统本身可能如何使用此调用(我吗?).如果我在我的应用程序中再次进行该调用,是否可以安全地读取数据库,或者它是否只会对我的应用程序中使用相同sqlite3数据库句柄的多个线程的并发访问产生冲突?

无论如何,我的问题是......

我可以安全地读取iOS也可以访问的这个数据库,如果是这样,怎么样?

Jor*_*ner 12

我从未使用过SQLite,但是我花了相当多的时间阅读它的文档,因为我计划将来使用它(而且文档很有趣).我要说线程安全性与多个进程是否可以同时访问同一个数据库文件无关.SQLite,无论它处于何种线程模式,都将锁定数据库文件,以便多个进程可以一次从数据库中读取,但只有一个可以写入.

线程安全仅影响您的进程如何使用SQLite.没有任何线程安全性,您只能从一个线程调用SQLite函数.但是,它应该在写入之前采用EXCLUSIVE锁,以便其他进程不会破坏数据库文件.如果使用多个线程,线程安全只会保护进程内存中的数据不被破坏.因此,我认为您不必担心另一个进程(在本例中为iOS)对SQLite数据库的影响.

编辑:为了澄清,每当你写入数据库,包括一个普通的INSERT/ UPDATE/ DELETE,它将自动采取一个EXCLUSIVE锁,写入数据库,然后释放锁.(它实际上需要一个SHARED锁,然后是一个RESERVED锁,然后一个PENDING锁,然后写一个EXCLUSIVE锁.)默认情况下,如果数据库已被锁定(比如说来自另一个进程),那么SQLite将返回SQLITE_BUSY而不等待.你可以打电话sqlite3_busy_timeout()告诉它等待更长时间.