что происходит при прерывании записи в базу данных sqlite3?

1

Вопрос: Когда происходит фактическая запись в файл sqlite3 db и что происходит, если он прерывается?


информация:

У меня есть эта программа на python, над которой я работал в течение нескольких недель, которая использует sqlite3 для хранения больших объемов данных из имитационного моделирования. Но есть две ситуации, о которых я беспокоюсь.

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

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

~ п

Теги:
sqlite3

1 ответ

4
Лучший ответ

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

Если вы обеспокоены тем, что база данных оставлена ​​в недопустимом состоянии, вам нужно убедиться, что вы завершаете все "переходное" состояние в BEGIN TRANSACTION ... COMMIT.

Подробные сведения о записи в файлы журнала и т.д. (в том числе через сбои) содержатся в документе "Блокировка файлов и Concurrency в версии SQLite 3" .

  • 0
    когда вы говорите все или ничего, значит ли это, что если у меня есть 1000-10000 новых записей для фиксации (размер моего среднего коммита), это фиксирует таким образом, что если, скажем, я потерял мощность вокруг записи 573, то ни одна из записей не будет совершить? или он фиксирует до записи 537, а остальные просто теряются из-за отключения электроэнергии?
  • 0
    @Nacrolapser: если эти 1000 новых записей находятся в одной транзакции, ни одна из них не попадет в базу данных (кроме как мусор в журнале транзакций). Если каждая вставка находится в транзакции, в базе данных будет присутствовать последний действительный коммит до сбоя.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню