0

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

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

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

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

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

一般来说,执行查询的程序不知道查询是什么,它只是一个包装器。因此,我无法将查询分成两部分,一部分用于附加数据库,另一部分用于执行其余的查询。但我不确定这是否是问题所在。

4

1 回答 1

0

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

于 2012-06-12T20:37:34.073 回答