我们应该在SQLite事务内部还是外部绑定参数?
我对使用事务来提高性能感兴趣 这是我目前正在做的过程: 我这样做是因为,据我所知,当您准备一个语句时,您正在与SQLite引擎进行通信,所以在事务中包含这一点可能在某种程度上有所帮助???(我只是在猜测。) 问题:我是否应该将其更改为以下过程我们应该在SQLite事务内部还是外部绑定参数?,sqlite,transactions,Sqlite,Transactions,我对使用事务来提高性能感兴趣 这是我目前正在做的过程: 我这样做是因为,据我所知,当您准备一个语句时,您正在与SQLite引擎进行通信,所以在事务中包含这一点可能在某种程度上有所帮助???(我只是在猜测。) 问题:我是否应该将其更改为以下过程 我这样问是因为,让事务只包含一系列同质命令似乎更好???(同样,我也不知道;我只是猜测。)在BEGIN中准备语句没有任何好处(下面有警告) 在BEGIN之外准备语句有一点好处,因为事务的时间会稍微短一些(下面有第二个警告),因此允许更多的并发性 在这两种
我这样问是因为,让事务只包含一系列同质命令似乎更好???(同样,我也不知道;我只是猜测。)在
BEGIN
中准备语句没有任何好处(下面有警告)
在BEGIN
之外准备语句有一点好处,因为事务的时间会稍微短一些(下面有第二个警告),因此允许更多的并发性
在这两种情况下,请确保在重用语句之前重置该语句,并在关闭数据库之前完成该语句
警告1:如果数据库模式发生更改,则需要重新准备语句。如果使用推荐的sqlite3\u prepare\u v2()
,则SQLite将为您执行此操作。您可以通过在事务内部进行准备来避免架构更改,但请注意,您需要使用beginimmediate
来确保数据库已锁定
警告2:由于您使用的是BEGIN
而不是beginimmediate
,因此在事务的第一条语句被步进之前,数据库锁实际上不会被执行。因此,除非使用beginimmediate
,否则实际上没有并发优势
在事务外部准备语句还有其他优点,例如,您可以在多个事务中使用它们,而无需多次准备。然而,维持其生命周期的逻辑变得更加复杂/花费更多
* ~~~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~~~
* 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~~~