Потоковая безопасность и одновременная модификация таблицы в SQLite3 - PullRequest
4 голосов
/ 10 декабря 2008

Означает ли безопасность потоков SQLite3, что разные потоки могут одновременно изменять одну и ту же таблицу базы данных?

Ответы [ 4 ]

6 голосов
/ 31 июля 2009

Нет - SQLite не поддерживает одновременный доступ для записи в один и тот же файл базы данных. SQLite просто заблокирует одну из транзакций, пока другая не завершится.

4 голосов
/ 24 мая 2010

обратите внимание, что если вы используете python, для доступа к соединению sqlite3 из разных потоков вам необходимо отключить аргумент check_same_thread, например:

sqlite.connect (": memory:", check_same_thread = False)

по состоянию на 24 мая 2010 г. в документах эта опция не указана. упущение указано как ошибка здесь

1 голос
/ 17 июня 2013

Вы можете использовать SQLite в 3 различных режимах:

http://www.sqlite.org/threadsafe.html

Если вы решили использовать многопоточный режим или сериализованный режим, вы можете легко использовать SQLite в многопоточном приложении. В таких ситуациях вы все равно можете одновременно читать все ваши темы. Если вам нужно писать одновременно, открытая таблица автоматически блокируется для текущего потока записи и разблокируется после этого (следующий поток будет ожидать (мьютекс) своей очереди, пока таблица не будет разблокирована). Во всех этих случаях вам нужно создать отдельную строку подключения для каждого потока (.NET Data.Sqlite.dll). Если вы используете другую реализацию (например, какую-либо оболочку Android), иногда все иначе.

1 голос
/ 10 декабря 2008

Не обязательно. Если sqlite3 скомпилирован с потокобезопасным макросом (проверьте с помощью функции

int sqlite3_threadsafe(void)
), вы можете попытаться получить доступ к одной и той же БД из нескольких потоков без риска повреждения. Однако, в зависимости от требуемой блокировки, вы можете или не можете реально изменять данные (я не верю, что sqlite3 поддерживает блокировку строк, а это значит, что для записи вам понадобится блокировка таблицы). Тем не менее, вы можете попробовать; если один поток блокируется, то он автоматически запишет, как только другой поток завершит работу с БД.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...