Chinaunix首页 | 论坛 | 博客
  • 博客访问: 344042
  • 博文数量: 42
  • 博客积分: 1896
  • 博客等级: 上尉
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 14:47
文章分类

全部博文(42)

文章存档

2012年(1)

2011年(21)

2010年(16)

2009年(4)

分类: 数据库开发技术

2010-03-23 11:26:36

   虽然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()调用传输一个数据库连接给子进程。这将会导致问题。
阅读(3744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~