首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite异常: SQLite忙

SQLite异常: SQLite忙
EN

Stack Overflow用户
提问于 2009-06-08 10:14:47
回答 5查看 34.8K关注 0票数 12

任何人可以提供任何关于此错误的输入。我正在尝试使用目标C插入到表中。

当我这样做的时候,我得到了一个错误SQLite Busy。为什么会发生这种情况?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-08 10:25:24

如果我没弄错,“忙”意味着你不能获得锁。似乎另一个进程(或线程等)在数据库上有一个锁。

File Locking And Concurrency In SQLite Version 3

票数 12
EN

Stack Overflow用户

发布于 2009-06-08 12:52:43

如果在调用sqlite3函数时得到错误代码SQLITE_BUSY,这意味着正如drdaeman观察到的那样,数据库已被同一进程或进程中的一个线程锁定。

处理这种情况的正确方法是在循环中尝试操作,如果返回代码仍然是SQLITE_BUSY,等待一段时间(决定超时值),然后在下一次循环迭代中重试该操作。

例如,以下代码片段摘自Objective C包装器FMDB (http://code.google.com/p/flycode/source/browse/trunk/fmdb),展示了如何在考虑到某些操作可能返回SQLITE_BUSY的情况下为查询准备语句:

代码语言:javascript
复制
int numberOfRetries = 0;
BOOL retry          = NO;

if (!pStmt) {
    do {
        retry   = NO;
        rc      = sqlite3_prepare(db, [sql UTF8String], -1, &pStmt, 0);

        if (SQLITE_BUSY == rc) {
            retry = YES;
            usleep(20);

            if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
                NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
                NSLog(@"Database busy");
                sqlite3_finalize(pStmt);
                [self setInUse:NO];
                return nil;
            }
        }
        else if (SQLITE_OK != rc) {


            if (logsErrors) {
                NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
                NSLog(@"DB Query: %@", sql);
                if (crashOnErrors) {

                    NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
                }
            }

            sqlite3_finalize(pStmt);

            [self setInUse:NO];
            return nil;
        }
    }
    while (retry);
}

顺便说一句,如果您需要访问sqlite,相对于通过本机C API直接访问而言,FMDB非常方便且使用起来要简单得多。

票数 24
EN

Stack Overflow用户

发布于 2011-04-14 05:27:43

我在顺序INSERT INTO命令中使用SQLITE_BUSY时也遇到了类似的问题。第一行插入ok,但当应用程序尝试插入第二行时,我得到了SQLITE_BUSY状态。在谷歌搜索之后,我了解到必须在执行语句后调用sqlite3_finalize():http://www.sqlite.org/c3ref/finalize.html。完成我的语句解决了我的问题。

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

https://stackoverflow.com/questions/964207

复制
相关文章

相似问题

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