当前位置:  开发笔记 > 数据库 > 正文

sqlite并发问题

如何解决《sqlite并发问题》经验,为你挑选了0个好方法。

我正在使用一个使用sqlite数据库的iPhone应用程序.该应用程序在后台线程中使用主线程中的UI下载Internet数据.后台下载线程可以在数据库上执行INSERT,UPDATE和SELECT.UI层还可以通过执行UPDATE和SELECT与数据库交互.如果我在后台线程下载时没有与UI进行大量交互,一切正常.但是,当在下载过程中执行主(UI)线程上的大量UPDATE时,我开始遇到问题.

应用程序在尝试运行数据库功能时始终退出.它退出EXC_BAD_ACCESS,我没有看到任何错误.例如,它最后一次退出时以sqlite3_step结束:

    sqlite3_stmt *statement;
const char *query = "INSERT OR IGNORE INTO `names` (`id`,`name`) VALUES (?,?);";
if(sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK){
    NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
    return NO;
}
sqlite3_bind_int(statement, 1, id);
sqlite3_bind_text(statement, 2, name, -1, SQLITE_TRANSIENT);

if(sqlite3_step(statement) != SQLITE_DONE)
    NSAssert1(0, @"Error while inserting. '%s'", sqlite3_errmsg(database));

sqlite3_finalize(statement);

它并不总是退出sqlite3_step,有时会退出sqlite3_prepare_v2或sqlite3_exec.我已经尝试将这些语句放在循环中,如果它没有返回OK,请再试一次,但这也不起作用:

int returnCode = 0;
do{
    returnCode = sqlite3_step(statement);
    if(returnCode != SQLITE_DONE){
        usleep(20);
    }
}while(returnCode != SQLITE_DONE);

我也尝试过SQL事务,但这没有任何区别.我怎么解决这个问题?它似乎是一个相当基本的并发问题,但我没有看到任何适合我的东西.

谢谢你的帮助,贾斯汀

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有