哪些语句属于 SQLite 3 中的事务?
Which statements belong to a transaction in SQLite 3?
我打算编写一个使用 SQLite 3 与数据库通信的多线程应用程序。计划多线程并发读写数据库
我想做的一件事是在事务中执行一系列语句。这一系列语句不能组合成单个查询,因为我的应用程序需要在语句之间执行应用程序逻辑以确定接下来要执行的语句。至关重要的是,事务中所做的更改仅以原子方式对其他线程可见,即整个事务或其 none 随时可见。其中一些事务仅执行 SELECT
语句,其他事务还执行 UPDATE
或 INSERT
语句。
现在我的计划是让所有线程同时使用一个 sqlite3
对象。每当线程需要执行事务时,它会从某处获取一组准备好的语句并根据需要执行它们。我确保没有准备好的语句一次被多个线程使用。
我发现 sqlite_prepare
和 sqlite_step
函数族都不允许我指定一个上下文来标识语句为 运行 的事务。 SQLite 如何(如果有的话)识别哪些语句属于哪个事务?文档在这件事上一直没有定论。
如果无法识别 运行 语句中的事务,我相信我必须使用多个连接到同一个数据库,因为至少连接上下文可以识别我的语句正在执行的事务. 这将需要稍微不同的程序设计,这就是为什么我还没有开始编写数据库代码并且无法显示其中的任何内容(因为它不存在)。
据我所知,这不是 SQLite 的工作方式。由于您使用 BEGIN
开始事务,所有数据库访问都在事务内部发生,直到您发出 COMMIT
或 ROLLBACK
.
sqlite3_get_autocommit()
会告诉你是否在交易中。
一个连接一次只能有一个事务。
所以如果你想将多个线程彼此隔离,你必须为每个线程使用一个连接,或者在数据库外序列化线程。
我打算编写一个使用 SQLite 3 与数据库通信的多线程应用程序。计划多线程并发读写数据库
我想做的一件事是在事务中执行一系列语句。这一系列语句不能组合成单个查询,因为我的应用程序需要在语句之间执行应用程序逻辑以确定接下来要执行的语句。至关重要的是,事务中所做的更改仅以原子方式对其他线程可见,即整个事务或其 none 随时可见。其中一些事务仅执行 SELECT
语句,其他事务还执行 UPDATE
或 INSERT
语句。
现在我的计划是让所有线程同时使用一个 sqlite3
对象。每当线程需要执行事务时,它会从某处获取一组准备好的语句并根据需要执行它们。我确保没有准备好的语句一次被多个线程使用。
我发现 sqlite_prepare
和 sqlite_step
函数族都不允许我指定一个上下文来标识语句为 运行 的事务。 SQLite 如何(如果有的话)识别哪些语句属于哪个事务?文档在这件事上一直没有定论。
如果无法识别 运行 语句中的事务,我相信我必须使用多个连接到同一个数据库,因为至少连接上下文可以识别我的语句正在执行的事务. 这将需要稍微不同的程序设计,这就是为什么我还没有开始编写数据库代码并且无法显示其中的任何内容(因为它不存在)。
据我所知,这不是 SQLite 的工作方式。由于您使用 BEGIN
开始事务,所有数据库访问都在事务内部发生,直到您发出 COMMIT
或 ROLLBACK
.
sqlite3_get_autocommit()
会告诉你是否在交易中。
一个连接一次只能有一个事务。
所以如果你想将多个线程彼此隔离,你必须为每个线程使用一个连接,或者在数据库外序列化线程。