2016-03-04 29 views
-1

我打算编写一个使用SQLite 3与数据库进行通信的多线程应用程序。计划数据库由多个线程同时读取和写入。哪些语句属于SQLite 3中的事务?

我想要做的事情之一是在事务中执行一系列语句。由于我的应用程序需要在语句之间执行应用程序逻辑以确定接下来要执行的语句,因此无法将这一系列语句组合为单个查询。至关重要的是,事务中所做的更改只能以原子方式在其他线程中可见,即无论是整个事务还是全部事务在任何时候都不可见。其中一些交易仅执行SELECT报表,其他交易也执行UPDATEINSERT报表。

现在我的计划是让所有线程同时使用一个对象sqlite3。无论何时线程需要执行事务,它都会从某处获取一组准备好的语句,并根据需要执行它们。我确保一次没有多个线程使用准备好的语句。

我发现sqlite_prepare而不是sqlite_step函数家族都允许我指定一个上下文来标识语句运行的事务。 (如果有的话)SQLite如何识别哪些语句属于哪个事务?关于这个问题,文件没有定论。

如果没有办法识别要在其中运行语句的事务,我相信我必须使用多个连接到同一个数据库,因为至少连接上下文标识了我的语句正在执行哪个事务。这需要有点不同的程序设计,这就是为什么我没有开始编写数据库代码,并且不能显示任何代码(因为它不存在)。

回答

2

连接一次只能有一个事务。

所以如果你想隔离多个线程,你必须为每个线程使用一个连接,或者串行化数据库外的线程。

1

AFAIK是不是SQLite的工作方式。由于您以BEGIN开始交易,所有数据库访问都在交易中发生,直到您发出COMMITROLLBACK

sqlite3_get_autocommit()会告诉你你是否在交易中。

+0

这很有道理。所以如果我需要同时运行多个事务,我需要多次连接到同一个数据库? – fuz

+0

我想是的,尽管我从未做过。我通常只使用一个连接和一个互斥体来避免并发数据库更新 – qrdl

+0

我明白了。感谢您的帮助,我会在接受答案之前等待确定性更高的人。 – fuz