2

我对使用事务来提高性能很感兴趣。

这是我目前正在做的过程:

* ~~~BEGIN TRANSACTION~~~
* Instance a command object and set the command text.
* Prepare command text so parameters can be added.
* In a loop, I set the values of said parameters and execute the command.
* ~~~COMMIT~~~

我这样做是因为据我了解,当您准备语句时,您正在与 SQLite 引擎进行通信,因此在事务中包含它可能会在某种程度上有所帮助???(我只是推测。)

.

问题: 我应该将其更改为以下过程吗?

* Instance a command object and set the command text.
* Prepare command text so parameters can be added.
* ~~~BEGIN TRANSACTION~~~
* In a loop, I set the values of said parameters and execute the command.
* ~~~COMMIT~~~

我问这个问题是因为,也许使交易只包含一系列同质命令似乎会更好???(同样,我不知道;我只是在猜测。)

4

1 回答 1

5

在里面准备语句没有任何好处BEGIN(下面有警告)。

在外部准备语句有一个小的优势,BEGIN因为事务会在时间上稍微小一些(下面有第二个警告),从而允许更多的并发性。

在任何一种情况下,请务必在重用之前重置语句,并在关闭数据库之前完成语句。

警告 1:如果数据库模式发生变化,则需要重新准备语句。如果您使用推荐的,sqlite3_prepare_v2()那么 SQLite 将为您执行此操作。您可以通过在事务内部进行准备来避免架构更改,但请注意,您需要使用BEGIN IMMEDIATE以确保数据库已锁定。

警告 2:由于您使用BEGIN而不是BEGIN IMMEDIATE数据库锁,因此直到事务的第一条语句被执行时才实际使用。因此,除非您使用BEGIN IMMEDIATE.

在事务之外准备语句还有其他优点,例如,您可以在多个事务中使用它们而无需多次准备。但是,维持其生命周期的逻辑变得更加复杂/复杂。

于 2013-05-24T00:03:14.027 回答