在多线程环境中使用sqlite

时间:2013-09-26 05:34:43

标签: multithreading sqlite transactions

我一直试图围绕关于多线程的SQLite文档,但仍然不太明白。假设我有2个线程可以从DB读取和写入。我的写入包含多个sql语句,因此我需要将它们包装在显式事务中,如下所示:

sqlite3_exec (myDb, "BEGIN TRANSACTION", 0, 0, 0);
// write stuff here
sqlite3_exec (myDb, "COMMIT TRANSACTION", 0, 0, 0);

第一个问题:我是否需要在事务中包装读取操作对我来说是主要要求,直到写入事务完成它不应该读取半数写入数据

第二:我可以在两个线程中使用一个数据库连接吗? - 看起来我不能,因为如果两个线程都写入DB,因此两个打开的事务第二个“BEGIN TRANSACTION”语句都将失败。

那么这里的正确方法是什么:使用自己的锁定机制?每个线程使用一个连接? - 在这种情况下会发生什么,我应该担心SQL_BUSY / SQL_LOCKED吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

当两个线程不得干扰彼此的事务时,必须使用单独的连接。

对于并发事务,可能会发生冲突,因此您应设置忙超时或安装忙处理程序。 如果所有连接都来自同一程序中的线程,则可以通过将所有事务包装到互斥锁中来避免冲突。