SQLite блокирует базу данных вся во время операции записи (т. Е. Когда запись происходит в любую таблицу, никакая другая запись в любую таблицу в любом месте может происходить одновременно).Некоторые базы данных обеспечивают одновременную запись посредством блокировок на уровне таблиц или иногда на уровне строк.В отличие от реализации SQLite, блокировка на уровне таблицы в основном означает, что когда вы записываете данные в заданную таблицу, никакой другой поток не может одновременно записывать данные в любую запись в этой таблице (однако запись в другие таблицы можетпроисходят одновременно, в некоторых обстоятельствах).Точно так же блокировки на уровне строк делают это еще более значительным и позволяют блокировать только необходимые строки, что позволяет выполнять одновременную запись в одну и ту же таблицу из нескольких потоков.Идея здесь состоит в том, чтобы минимизировать объем данных, которые необходимо заблокировать для операции записи, что эффективно увеличивает количество одновременных записей, возможных по базе данных, и в зависимости от вашей реализации / того, как вы используете свою базу данных,это может значительно увеличить пропускную способность.
Теперь вернемся к вашему вопросу ...
Тот факт, что SQLite является потокобезопасным, не означает, что несколько потоков могут одновременно писать в него - это означает, что онимеет способ обработки доступа из нескольких потоков: (а) разрешить тайм-ауты / повторные попытки и (б) вернуть полезную ошибку (SQLITE: занято), когда в настоящее время в базе данных удерживается блокировка.То есть threadsafe означает не более чем: «Несколько потоков могут получить доступ к этим данным таким образом, чтобы не повредить данные из-за одновременного доступа.»
По сути, где-то вкод, один поток пытается сделать свое обновление, прежде чем другой поток снял свою блокировку на базе данных.Это обычное препятствие для SQLite, потому что авторы / документация скажут вам, что SQLite может обрабатывать параллелизм как чемпион.Реальность такова, что то, что SQLite считает «поддержкой параллелизма», означает попытку быть очень быстрой, чтобы блокировки в базе данных удерживались только в течение очень короткого времени, и поэтому блокировки в базе данных снимались до истечения времени ожидания.Во многих случаях это работает просто отлично и никогда не мешает вам.Однако наличие очень кратковременных блокировок - это не то же самое, что 1014 *, что фактически позволяет одновременную запись из нескольких потоков.
Думайте об этом как о том, как iOS выполняет многозадачность (по крайней мере, в iOS 5)., когда я пишу это) - на самом деле он ставит другие приложения на паузу и возвращается к ним.Это приводит к тому, что (а) срок службы батареи намного лучше из-за более низкой загрузки процессора, и (б) вам не нужно запускать приложение с нуля при каждом его запуске.Это замечательно, но само слово «многозадачность», используемое в iOS, технически не означает то же самое, что и «многозадачность» в других средах (даже Mac OS X).
SQLite - то же самое.Есть ли у них поддержка "параллелизма"?Ну, вроде как, но то, как они определяют слово «параллелизм», не то, как остальной мир БД определяет «параллелизм».
Никто не ошибается, но в подобных случаях он добавляетдо реализации путаницы.