Хотя SQLite «поточно-ориентированный», вы все равно не можете одновременно изменить базу данных:
Затем каждый поток продолжает вставлять
количество записей, скажем, 1000.
проблема, с которой вы столкнетесь,
следующее: один поток получит контроль
через базу данных, установив блокировку на
файл. Это хорошо, но остальное
из потоков будет продолжать сбой
за каждую попытку ВСТАВИТЬ, пока
Блокировка активна.
( ссылка )
Только один поток может изменять базу данных одновременно, но вы можете иметь несколько потоков, которые пытаются изменить базу данных.
Если вы хотите избежать проблемы сбоя при блокировке, вы можете проверить флаг SQLITE_BUSY:
Тест для SQLITE_BUSY, который я не сделал
сделать изначально. Вот немного псевдокода
чтобы проиллюстрировать решение:
while (continueTrying) {
retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval) {
case SQLITE_BUSY:
Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
sleep a bit... (use something like sleep(), for example)
break;
case SQLITE_OK:
continueTrying = NO; // We're done
break;
default:
Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
continueTrying = NO;
break;
}
}
return retval;
та же ссылка
Держу пари, что ваше нарушение ограничения не имеет ничего общего с многопоточностью, поэтому не могли бы вы опубликовать фактическое полученное нарушение ограничения (или пример, соответствующий www.sscce.org ) .