Tôi đang làm việc trên một ứng dụng iPhone sử dụng cơ sở dữ liệu sqlite. Ứng dụng tải xuống dữ liệu ngoài Internet trong chuỗi nền với giao diện người dùng trong chuỗi chính. Chủ đề tải xuống nền có thể tạo sẵn INSERT, UPDATE và SELECT trên cơ sở dữ liệu. Lớp UI cũng có thể tương tác với cơ sở dữ liệu bằng cách thực hiện UPDATE và SELECT. Nếu tôi không tương tác nhiều với giao diện người dùng trong khi chuỗi nền đang tải xuống, mọi thứ đều hoạt động tốt. Tuy nhiên, tôi bắt đầu gặp sự cố khi nhiều CẬP NHẬT trên luồng chính (UI) được thực hiện trong khi quá trình tải xuống đang diễn ra.Các vấn đề về tương tranh sqlite
Ứng dụng luôn thoát khi đang cố chạy chức năng cơ sở dữ liệu. Nó thoát với EXC_BAD_ACCESS và tôi không thấy bất kỳ lỗi nào. Ví dụ, lần cuối cùng nó bỏ nó kết thúc vào lúc 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);
Nó không phải luôn luôn bỏ vào sqlite3_step, đôi khi nó bỏ vào sqlite3_prepare_v2 hoặc sqlite3_exec. Tôi đã thử đặt các câu lệnh này trong một vòng lặp và thử lại nếu nó không trả về OK, nhưng điều đó không hoạt động:
int returnCode = 0;
do{
returnCode = sqlite3_step(statement);
if(returnCode != SQLITE_DONE){
usleep(20);
}
}while(returnCode != SQLITE_DONE);
Tôi cũng đã thử các giao dịch SQL, nhưng điều đó không tạo ra bất kỳ sự khác biệt nào . Làm sao tôi có thể giải quyết việc này? Nó có vẻ như nó là một vấn đề đồng thời khá cơ bản nhưng tôi đã không nhìn thấy bất cứ điều gì mà làm việc cho tôi.
Cảm ơn bạn cho tất cả sự giúp đỡ của bạn, Justin
Ứng dụng * thoát *? Chỉ để được tò mò, nó chỉ là một số loại xây dựng cụ thể của Apple? Trong vani Sqlite nó chỉ trả về lỗi 'SQLITE_LOCKED' nếu có tranh chấp, và bạn cũng có thể cài đặt một trình xử lý bận để đưa ra quyết định về việc thử lại trong những trường hợp này. –