我对使用交易进行表现感兴趣。
这是我目前正在做的过程:
* ~~~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~~~
我问这个是因为,也许,使交易只包含一系列同质命令似乎可能更好? (再一次,我不知道;我只是在推测。)
答案 0 :(得分:5)
准备BEGIN
内的陈述没有任何好处(下面有警告)。
准备BEGIN
之外的语句有一个小优势,因为事务的时间会稍微小一点(下面有第二个警告),从而允许更多的并发。
在任何一种情况下,请务必在重新使用之前重置语句,并在关闭数据库之前完成语句。
警告1:如果数据库架构发生更改,则需要重新准备语句。如果您使用推荐的sqlite3_prepare_v2()
,则SQLite将为您执行此操作。您可以通过在事务内部进行准备来避免架构更改,但请注意,您需要使用BEGIN IMMEDIATE
来确保数据库已锁定。
警告2:由于您使用BEGIN
而不是BEGIN IMMEDIATE
,因此在步骤的第一个语句被执行之前,实际上不会执行数据库锁定。因此,除非您使用BEGIN IMMEDIATE
,否则实际上并不存在并发优势。
准备交易之外的报表还有其他优点,例如,您可以在多个交易中使用它们而无需多次准备。然而,维持其生命周期的逻辑变得更加复杂/分配。