Lak*_*key 2 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~~~
Run Code Online (Sandbox Code Playgroud)
我这样做是因为,据我所知,当你准备一份声明时,你正在与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~~~
Run Code Online (Sandbox Code Playgroud)
我问这个是因为,也许,使交易只包含一系列同质命令似乎可能更好??? (再一次,我不知道;我只是在猜测.)
准备内部陈述没有任何好处BEGIN(下面有警告).
准备之外的语句有一个小优势,BEGIN因为事务的时间会稍微小一些(下面有第二个警告),从而允许更多的并发性.
在任何一种情况下,请务必在重用之前重置语句,并在关闭数据库之前完成语句.
警告1:如果数据库架构发生变化,则需要重新准备该语句.如果您使用推荐,sqlite3_prepare_v2()那么SQLite将为您执行此操作.您可以通过在事务内部进行准备来避免模式更改,但请注意,您需要使用BEGIN IMMEDIATE以确保数据库已锁定.
警告2:由于您使用BEGIN而不是BEGIN IMMEDIATE数据库锁,因此直到事务的第一个语句被逐步执行才会实际执行.因此,除非您使用,否则并不存在真正的并发优势BEGIN IMMEDIATE.
在事务外部准备语句还有其他优点,例如,您可以在多个事务中使用它们而无需多次准备.但是,维持其生命周期的逻辑变得更加复杂/分配.
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |