虽然SQLite的官方文档推荐避免在多线程使用,但是SQLite是线程安全的。但需要在编译SQlite时使用把预编译宏SQLITE_THREADSAFE设置为1。官方发布的Linux版本和Windows版本的都设置了这个选项。此外也可以通过调用api : ssqlite3_threadsafe()来确实是否线程安全版本。
在版本3.3.1之前,sqlite3结构只能在使用sqlite3_open()创建它的线程中使用。不能在一个线程创建然后传递给另外一个线程使用。这是由于很多常见的多线程实现(例如redhat9.0)的限制。具体来说,在这些麻烦的系统中fcntl()的锁不能非创建线程来移除。而恰恰SQLite在并发控制中大量使用了fcntl()锁,如果跨线程使用数据库连接会发生严重的问题。
不过在3.3.3版本中,这些约束稍微得到改善。在3.3.1及后继版本中,在线程中传递没有保持fcncl()锁的数据库连接是安全的。可以假想成在没有未完成事务和所有statement已经被finalized情况下是不持有fcntl()锁。
在unix下,不能在fork()调用传输一个数据库连接给子进程。这将会导致问题。
阅读(3805) | 评论(0) | 转发(0) |