Я разрабатываю приложение с SQLite в качестве базы данных, и у меня есть небольшая проблема с пониманием того, как использовать его в несколько потоков (ни один из других вопросов действительно не помог мне, к сожалению).
Мой прецедент: в базе данных есть одна таблица, позвольте ей "A", которая имеет разные группы строк (на основе одного из своих столбцов). У меня есть "основной поток" приложения, который читает содержимое из таблицы A. Кроме того, я иногда решает обновить определенную группу строк. Для этого я хочу создать новый поток, удалить все строки группы и повторно вставить их (это единственный способ сделать это в контексте моего приложения). Это может произойти с разными группами одновременно, поэтому у меня могут быть 2+ темы, пытающиеся обновить базу данных.
Я использую разные транзакции из каждого потока, I.E. в начале каждого цикла обновления потока у меня есть начало. Фактически, каждый поток фактически выполняет вызов "BEGIN", удаляет из базы данных все строки, необходимые для "обновления", и вставляет их снова с новыми значениями (это так, как это должно быть сделано в контексте моего приложение).
Теперь я пытаюсь понять, как я это делаю. Я пробовал читать (другие ответы на Stack Overflow, сайт SQLite), но я не нашел ответы на все вопросы. Вот некоторые вещи, о которых мне интересно:
- Нужно ли мне "открывать" и создавать новую структуру sqlite из каждого потока?
- Нужно ли мне добавлять какой-либо специальный код для всего этого или достаточно, чтобы порождать разные потоки, обновлять строки, и это прекрасно (поскольку я использую разные транзакции)?
- Я видел что-то, говоря о различных типах блокировок, и о том, что я мог бы получить "SQLite занят" от вызова определенных API, но, честно говоря, я не видел ссылок, которые полностью объяснялись, когда мне нужно было все это в учетную запись. Нужно ли мне?
Если кто-то может ответить на вопросы/указать мне в сторону хорошего ресурса, я был бы очень благодарен.
ОБНОВЛЕНИЕ 1: Из всего, что я читал до сих пор, похоже, что у вас не может быть двух потоков, которые все равно будут записывать в файл базы данных.
Смотрите: http://www.sqlite.org/lockingv3.html. В разделе 3.0: ЗАБРОНИРОВАННАЯ блокировка означает, что процесс планирует записать в файл базы данных в какой-то момент в будущем, но в настоящее время он просто считывает из файла. За один раз может быть активен только один замок RESERVED, хотя несколько замков SHARED могут сосуществовать с одной блокировкой RESERVED.
Означает ли это, что я могу только порождать один поток, чтобы обновлять группу строк каждый раз? У меня есть какой-то поток poller, который решает, что мне нужно обновить некоторые из строк, а затем создает новый поток для этого, но не более одного за раз? Так как это похоже на то, что любой другой поток, который я создаю, просто получит SQLITE_BUSY до тех пор, пока не закончится первый поток.
Я правильно понял вещи?
Кстати, спасибо за ответы до сих пор, они очень помогли.