我们在多进程和多线程应用程序中使用SQLite.SQLite数据库文件使用嵌入式SQLite加密进行加密.的常见问题是SQLite的应该能够管理多进程状态存取使用锁机制.我们遇到了一个奇怪的问题:当许多线程访问同一个数据库文件时,有时会发生约束违规,更具体地说 - 具有唯一约束的字段在调用"insert或replace"语句后获得重复值.它现在经常发生,我们正在使用加密.在我们开始使用SQLite加密之前,我们没有注意到这种行为.这有什么具体的已知问题吗?
虽然SQLite是"线程安全的",但您仍然无法同时修改数据库:
然后每个线程继续插入一些记录,假设为1000.您将遇到的问题如下:一个线程将通过设置对文件的锁定来控制数据库.这很好,但是当锁定处于活动状态时,其余的线程将继续对每个尝试的INSERT失败.(参考)
一次只允许一个线程修改数据库,但是您可以拥有多个尝试修改数据库的线程.
如果要避免失败时锁定问题,可以检查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;
相同的参考
我敢打赌,你的约束违规与多线程无关,所以请你发布你得到的实际约束违规(或者一个符合www.sscce.org的例子).