отладка заблокированной базы данных sqlite3

Я пишу приложение на iOS, которое использует sqlite3, завернутый fmdatabase. Я сталкиваюсь с проблемой, что в какой-то момент моя программа застревает внутри библиотек FMDatabase, в частности, функция, которая вызывает sqlite3_step и обнаруживает, что база данных занята, а затем снова и снова повторяет.

Я ищу общие инструменты и советы для отладки, так как это будет слишком много, чтобы дать всю мою установку здесь. Некоторые вещи, которые могут иметь последствия, я открыл дескриптор базы данных для базы данных, которая уже имеет дескриптор в другом потоке. sqlite3_threadsafe () возвращает 2, поэтому я знаю, что он включен. Я также протестировал это новое соединение, сделав очень простой оператор select и update. Когда я запускаю свою программу и когда она пытается запустить обновление базы данных, я застрял.

Оператор обновления, который делает моя программа, не виноват, потому что этот запрос работает нормально, когда я НЕ открываю два соединения. Тем не менее, я не вижу, где я могу ошибиться …

Любая помощь или советы о том, где я могу ошибаться, будут очень признательны.

One Solution collect form web for “отладка заблокированной базы данных sqlite3”

SQLite блокирует всю базу данных во время операции записи (т. Е. Когда запись происходит в любой таблице, никакая другая запись в любую таблицу в любом месте не может произойти одновременно). Некоторые базы данных обеспечивают одновременную запись через блокировки на уровне таблицы или иногда блокировки на уровне строк. Чтобы сопоставить это с реализацией SQLite, блокировка на уровне таблиц в основном означает, что когда вы записываете данные в данную таблицу, ни один другой поток не может записывать в любую запись в этой таблице одновременно (однако записи в другие таблицы могут происходят одновременно, в некоторых случаях). Аналогично, блокировки на уровне строк принимают его еще больше и позволяют блокировать только необходимые строки, что позволяет одновременной записи в ту же таблицу из нескольких потоков. Идея здесь заключается в том, чтобы свести к минимуму количество данных, которое необходимо заблокировать для операции записи, что эффективно увеличивает количество одновременных записей, доступных в базе данных, и в зависимости от вашей реализации / использования вашей базы данных это может значительно увеличить пропускную способность.

Теперь вернемся к вашему вопросу …

Тот факт, что SQLite является потокобезопасным, не означает, что несколько потоков могут одновременно записываться на него – это означает, что у него есть способ обработки доступа из нескольких потоков, – чтобы (а) разрешать тайм-ауты / повторы и (б) возвращать полезная ошибка (SQLITE: Занято), когда блокировка в настоящее время хранится в базе данных. То есть потокобезопасность означает не что иное, как «Несколько потоков могут получить доступ к этим данным таким образом, который не приведет к повреждению данных из-за одновременного доступа».

В принципе, где-то в коде один поток пытается выполнить свое обновление, прежде чем другой поток освободит свою блокировку в базе данных. Это распространенное препятствие с SQLite, потому что авторы / документация скажут вам, что SQLite может обрабатывать параллелизм как чемпион. Реальность такова, что SQLite считает «поддержку параллелизма» – это попытка быть очень быстрой, так что блокировки в базе данных сохраняются в течение очень короткого времени, и поэтому блокировки базы данных будут выпущены до того, как будут удалены таймауты. Во многих случаях это прекрасно работает и никогда не мешает вам. Однако наличие очень коротких замыканий не является тем же самым, что фактически позволяет одновременную запись из нескольких потоков.

Думайте об этом, как о том, как iOS выполняет многозадачность (по крайней мере, на iOS 5, когда я пишу это) – действительно, что он делает, это переводить другие приложения на паузу и возвращаться к ним. Это приводит к тому, что (a) срок службы батареи намного лучше из-за более низкого использования ЦП и (б) вам не нужно запускать приложение с нуля каждый раз, когда вы его запускаете. Это здорово, но фактическое слово «многозадачность», используемое в iOS, технически не означает то же самое, что «многозадачность» в других средах (даже Mac OS X).

SQLite – это то же самое. У них есть поддержка «параллелизма»? Ну вроде, но способ, которым они определяют слово «параллелизм», не таков, как остальная часть мира БД определяет «параллелизм».

Никто не ошибается, но в подобных случаях он добавляет к путанице реализации.

  • База данных в IOS Sqlite3 и db
  • Есть ли эквивалент sqlite .dump в объекте-c?
  • Обновление новой версии для магазина приложений с использованием другой структуры db sqlite
  • Запрос SQLite3 (iOs) не выполняется
  • Хранение и извлечение изображения из базы данных sqlite в iOS
  • iOS - вставка SQLite, не вставляющая данные
  • как добавить столбец в таблице sqlite в SWIFT
  • Ошибка sqlite3_prepare_v2 - Уже выполняется предыдущий запрос
  • конвертировать базу данных sqlite в nsdata и обратно
  • Выбирать оператор в SQLite, определяющем номер строки
  • Swift Framework - Как импортировать sqlite3.h в файл зонтика
  • Interesting Posts

    Не удалось создать приложение iOS в Xcode 6

    Как использовать имя удаленного приложения в iTunes Connect?

    xcode 8 Debugger 'Не удалось разрешить тип'

    Возможно ли при покупке приложения в ios использовать подписку на конкретную учетную запись?

    Связь типов файлов с моим приложением

    заблокировать ориентацию viewController в быстрой

    В отсутствие макросов препроцессора существует ли способ определить конкретные конкретные флаги схемы на уровне проекта в проекте Xcode

    Как определить событие окончания перетаскивания UITableView?

    Как удалить KVO-наблюдателя себя в категории UIButton?

    Приложения должны следовать рекомендациям по хранению данных iOS или они будут отклонены в приложении, которое содержит .sqlite3

    Swift 3 NSCache Общий параметр «KeyType» не может быть выведен

    Отображать push-уведомление в качестве предупреждающего сообщения в приложении iOS

    Подождите, пока все сетевые запросы будут выполнены, включая их блоки завершения

    Не удалось удалить «Необязательный» из строки

    Локализация раскадровки Xamarin iOS

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.