首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当sqlite3_exec返回SQLITE_BUSY时,如何安全地重试不透明查询?

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

Stack Overflow用户
提问于 2012-06-13 03:26:32
回答 1查看 578关注 0票数 0

我正在运行如下所示的查询:

代码语言:javascript
复制
ATTACH 'db2' as db;
BEGIN TRANSACTION; 
...
END TRANSACTION;

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

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

为了处理这个问题,我休眠了一段时间,然后重试事务。但是,现在我收到错误消息“无法在事务内附加数据库”。为什么会发生这种情况?在返回SQLITE_BUSY的情况下,原始附加是否成功?如果是这样,那么为什么我没有得到“数据库db2已经在使用中”?或者,尽管返回了SQLITE_BUSY,但上一个事务仍然打开吗?这对我来说没有任何意义,查询繁忙失败,所以事务不应该被打开。但它还能是什么呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 04:37:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11003465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档