我们应该在SQLite事务内部还是外部绑定参数?

时间:2013-05-23 22:58:34

标签: sqlite transactions

我对使用交易进行表现感兴趣。

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

* ~~~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~~~

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

1 个答案:

答案 0 :(得分:5)

准备BEGIN内的陈述没有任何好处(下面有警告)。

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

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

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

警告2:由于您使用BEGIN而不是BEGIN IMMEDIATE,因此在步骤的第一个语句被执行之前,实际上不会执行数据库锁定。因此,除非您使用BEGIN IMMEDIATE,否则实际上并不存在并发优势。

准备交易之外的报表还有其他优点,例如,您可以在多个交易中使用它们而无需多次准备。然而,维持其生命周期的逻辑变得更加复杂/分配。