0

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

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

第一个问题:我是否需要在事务中包装读取操作对我的主要要求是,在写入事务完成之前,应该不可能读取一半写入的数据

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

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

谢谢!

4

1 回答 1

0

When the two threads must not interfere with each other's transaction, you must use separate connections.

With concurrent transactions, it is possible to get conflicts, so you should set a busy timeout or install a busy handler. If all connections are from threads in the same program, you can avoid conflicts by wrapping all transactions into a mutex.

于 2013-09-26T08:18:58.123 回答