我打算编写一个使用SQLite 3与数据库通信的多线程应用程序。计划由多个线程同时读取和写入数据库。
我想要做的一件事是在事务中执行一系列语句。这一系列语句不能组合成单个查询,因为我的应用程序需要在语句之间执行应用程序逻辑以确定接下来要执行的语句。至关重要的是,事务中所做的更改仅以原子方式对其他线程可见,即整个事务或者在任何时候都不可见。其中一些交易仅执行SELECT
条款,其他交易也执行UPDATE
或INSERT
条款。
现在我的计划是让所有线程同时使用一个sqlite3
对象。每当线程需要执行事务时,它会从某处获取一组准备好的语句并根据需要执行它们。我确保一次不会有多个线程使用预准备语句。
我发现,sqlite_prepare
,而不是sqlite_step
函数系列都不允许我指定一个上下文来标识运行该语句的事务。如何(如果有的话)SQLite识别哪些语句属于哪个事务?该文件对此事尚无定论。
如果无法识别要运行语句的事务,我相信我必须使用多个连接到同一个数据库,因为至少连接上下文标识了我的语句正在执行的事务。这需要一些不同的程序设计,这就是为什么我还没有开始编写数据库代码并且无法显示它们(因为它不存在)。
答案 0 :(得分:2)
A connection can have only a single transaction at a time.
So if you want to isolate multiple threads from each other, you have to use one connection for each of them, or serialize the threads outside of the database.
答案 1 :(得分:1)
AFAIK is it not the way how SQLite works. Since you started the transaction with BEGIN
, all DB access is happening inside the transaction, until you issue COMMIT
or ROLLBACK
.
sqlite3_get_autocommit()
will tell you whether you are within transaction or not.