我正在使用一個sqlite數據庫的iPhone應用程序。該應用程序通過主線程中的UI在後臺線程中從互聯網下載數據。後臺下載線程可以對數據庫執行INSERT,UPDATE和SELECT操作。 UI層也可以通過執行UPDATE和SELECT來與數據庫進行交互。如果我在後臺線程正在下載時不與UI進行大量交互,則一切正常。但是,當下載正在進行時,主(UI)線程上執行了大量UPDATE時,我開始遇到問題。sqlite併發問題
應用程序在嘗試運行數據庫函數時總是退出。它退出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的交易,但是這並沒有任何區別。我該如何解決這個問題?這似乎是一個相當基本的併發問題,但我沒有看到任何對我有用的東西。
感謝您所有的幫助, 賈斯汀
應用*退出*?爲了好奇,它只是某種特定於Apple的版本?在香草Sqlite中,如果存在爭用,它只會返回'SQLITE_LOCKED'錯誤,並且您還可以安裝繁忙的處理程序,以在這些情況下對重試做出決定。 – 2010-02-24 10:19:11