Я боролся с «базы данных sqlite3.OperationalError заблокирован» весь день ....базы данных SQLite Джанго заблокирован
Поиск вокруг ответов на то, что, как представляется, хорошо известная проблема, я обнаружил, что это объясняется в большинстве случаев тем фактом, что sqlite не работает очень хорошо в многопоточности, где поток может потенциально затягиваться, ожидая более 5 (по умолчанию тайм-аута) секунд для записи в db, потому что другой поток имеет блокировку db.
Итак, имея больше потоков, которые играют с db, один из них использует транзакции и часто пишет, я начал измерять время, необходимое для завершения транзакций. Я обнаружил, что никакая транзакция занимает более 300 мс, что делает невозможным вышеупомянутую экспликацию. Если поток, который использует транзакции, совершает последовательные транзакции ~ 21 (5000 мс/300 мс), в то время как любой другой поток, желающий писать, все это время игнорируется.
Итак, какая другая гипотеза может объяснить это поведение?
нить держит соединение дб жив в то время как другой поток пытается написать ему ... все ваши записи должны быть сделаны в одном потоке –
, к сожалению, есть некоторые фоновые задачи, которые играют с db. Когда транзакция завершена, не закрывается ли ее соединение?, Чтобы другие потоки могли получить возможность писать? – steve
вы должны обрабатывать все свои транзакции db в одном потоке ... есть много «в теории», он должен работать, но на самом деле sqlite не был разработан с одновременным соединением в виду и, как таковой, имеет очень плохую поддержку ... альтернативно использовать база данных, которая знает о параллельных соединениях (mysql/postgres/mongo/etc) –