虽然 SQLite 是“线程安全的”,但您仍然无法同时修改数据库:
然后每个线程继续插入一个
记录数,假设为 1000。
你会遇到的问题是
如下:一个线程将获得控制权
通过设置锁定来访问数据库
文件。这很好,但其余的
线程将继续失败
对于每次尝试插入,而
锁处于活动状态。
(参考 http://www.sqlite.org/cvstrac/wiki?p=MultiThreading)
一次只允许一个线程修改数据库,但可以有多个线程attempt修改数据库。
如果你想避免锁定时失败的问题,你可以检查 SQLITE_BUSY 标志:
测试 SQLITE_BUSY,我没有测试
原来做。这是一些伪代码
来说明一个解决方案:
while (continueTrying) {
retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval) {
case SQLITE_BUSY:
Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
sleep a bit... (use something like sleep(), for example)
break;
case SQLITE_OK:
continueTrying = NO; // We're done
break;
default:
Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
continueTrying = NO;
break;
}
}
return retval;
相同的参考 http://www.sqlite.org/cvstrac/wiki?p=MultiThreading
我敢打赌,您的约束违规与多线程无关,所以您能否发布您收到的实际约束违规(或符合www.sscce.org http://www.sscce.org).