当sqlite3_exec返回SQLITE_BUSY时,如何安全地重试不透明查询?

时间:2012-06-12 19:26:32

标签: sqlite transactions

我正在运行看起来像这样的查询:

ATTACH 'db2' as db;
BEGIN TRANSACTION; 
...
END TRANSACTION;

我必须这样做,因为在交易中附加是错误的。

如果在发出上述查询时另一个连接已经在运行任何类型的查询,则似乎会出现此问题。然后整个查询似乎失败,返回SQLITE_BUSY。

要处理这个问题,我会睡一会儿,然后重试交易。但是,现在我收到错误“无法在事务中附加数据库”。为什么会这样? 尽管返回SQLITE_BUSY,原始附件是否成功?如果是这样,那么为什么我没有得到“数据库db2已经在使用”呢?或者,尽管返回了SQLITE_BUSY,但上一个事务是否仍处于打开状态?这对我来说没有意义,查询失败了,所以交易不应该被打开。但还有什么呢?

通常,执行查询的程序不知道查询是什么,它只是一个包装的包装。所以,我不能做一些事情,比如将查询拆分为两部分,一部分用于附加数据库,另一部分用于执行查询的其余部分。但无论如何,我不确定这是不是问题。

1 个答案:

答案 0 :(得分:0)

我还没有弄清楚为什么这种情况正在发生,但我发现一个令人满意的解决方案是在返回SQLITE_BUSY后调用sqlite3_close()后跟sqlite3_open()。这消除了重试上一个查询可能会绊倒的任何未决条件。