У меня есть база данных sqlite3, доступ к которой осуществляется несколькими потоками (3-4). Мне известны общие ограничения sqlite3 в отношении параллелизма, как указано http://www.sqlite.org/faq.html#q6, но я убежден, что это не проблема.
Все потоки читают и пишут из этой базы данных. Всякий раз, когда я делаю запись, у меня есть следующая конструкция:
try:
Cursor.execute(q, params)
Connection.commit()
except sqlite3.IntegrityError:
Notify
except sqlite3.OperationalError:
print sys.exc_info()
print("DATABASE LOCKED; sleeping for 3 seconds and trying again")
time.sleep(3)
Retry
На некоторых прогонах я даже не ударю по этому блоку, но когда я это сделаю, он никогда не выйдет из него (продолжает повторять, но я продолжаю получать ошибку «база данных заблокирована» из exc_info. Если я понимаю читателя Использование блокировки / Writer правильно, некоторое количество ожидания должно помочь с конфликтом. Это звучит как тупик, но я не использую никаких транзакций в моем коде, и каждый SELECT или INSERT просто один. Некоторые потоки, однако, сохраняйте то же соединение, когда они выполняют свою работу (которая включает в себя сочетание SELECTS и INSERTS и других модификаторов).
Я бы оценил это, если бы вы могли затенить это, а также способы его устранения (помимо использования другого механизма базы данных.)