2012-01-12 4 views

ответ

4

Способ явно заблокировать базу данных, это начать транзакцию, как описано в documentation:

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

Один из способов инициировать транзакцию является использовать connection as a context manager:

import sqlite3 
con = sqlite3.connect(...) 
... 
with con: 
    # Database is locked here 

отметить также, что некоторые сделки случаются implictly по умолчанию:

По умолчанию модуль sqlite3 открывает сделки неявным образом перед оператор языка изменения данных (DML) (т.е. INSERT/UPDATE/DELETE/REPLACE) и неявно совершает транзакции перед операцией без запроса DML, без запроса (т.е. ничего, кроме SELECT или вышеупомянутое).

+1

Просто чтобы быть ясно: если я использую 'с кон симулировать, я гарантировал, что все операции чтения и записи с базой данных внутри этого блока происходят вместе? (То есть другой поток не может изменить что-то, что я читаю). –

+0

Я разместил следующий вопрос по адресу http://stackoverflow.com/questions/9070369/locking-a-sqlite3-database-in-python-re-asking-for-clarification –

3

С SQLITE FAQ, "Can multiple applications or multiple instances of the same application access a single database file at the same time?":

Множественные процессы могут иметь ту же базу данных открытых в то же время. Несколько процессов могут выполнять SELECT одновременно. Но только один процесс может вносить изменения в базу данных в любой момент в раз, однако.

Независимо от того, используете ли вы конструкцию with connection, многие процессы могут считывать только один, который можно записать в базу данных в любой момент времени.

0

Мы можем использовать несколько команд процесса для блокировки процесса записи и чтения БД. Я использую следующие команды и свой рабочий режим. от многопроцессорной Импорт Заблокируйте l.Lock() l.acquire() Read/Write DB l.release()

Смежные вопросы