Параллельная запись с помощью sqlite3 [дубликат]

этот вопрос уже есть ответ здесь:

Я использую sqlite3 модуль python для записи результатов пакетных заданий в общий . Я выбрал SQLite, потому что несколько процессов могут пытаться писать одновременно, и, как я понимаю, SQLite должен handel эта скважина. Я не уверен в том, что происходит, когда несколько процессов заканчиваются и пытаются писать одновременно. Поэтому, если несколько процессов выглядят так

conn = connect('test.db')

with conn: 
    for v in xrange(10): 
        tup = (str(v), v)
        conn.execute("insert into sometable values (?,?)", tup)

выполнить сразу, они будут выбрасывать исключение? Вежливо ждать, пока другие процессы напишут? Есть ли лучший способ сделать это?

3 ответов


на sqlite библиотека заблокирует базу данных в процессе при записи в базу данных и каждый процесс будет ждать освобождения блокировки, чтобы получить свою очередь.

база данных не должна быть записана до тех пор, пока commit однако время. Вы используете соединение в качестве контекстного менеджера (хорошо!) таким образом, фиксация происходит после завершения цикла и all insert инструкции были выполнены.

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


Если каждый процесс содержит свое собственное соединение, чем это должно быть хорошо. Что произойдет, так это то, что при записи процесс заблокирует БД, поэтому все остальные процессы будут блокироваться. Они выдадут исключение, если тайм-аут превышено ожидание освобождения БД. Тайм-аут можно настроить с помощью вызова connect:

http://docs.python.org/2/library/sqlite3.html#sqlite3.connect

Не рекомендуется, чтобы у вас был файл DB в сети делиться.

обновление:

вы также можете проверить уровень изоляции: http://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level


хорошей новостью является то, что библиотека SQLLite неявно использует транзакцию, которая блокирует базу данных при выполнении DML. Это означает, что другие параллельные доступы к базе данных будут ждать завершения выполнения запроса DML путем фиксации/отката транзакции. Обратите внимание, однако, что несколько процессов могут выполнять SELECT одновременно.

кроме того, пожалуйста, обратитесь к Python SQL Lite 3.0 модуль в разделе 11.13.6 - контроль Сделок это подробно, как можно контролировать транзакции.