2010-06-28 92 views
1

問題:實際寫入sqlite3數據庫文件是什麼時候發生,如果中斷會發生什麼?當sqlite3 db寫入被中斷時會發生什麼?


信息:

我有這個節目在python,我一直在努力爲使用sqlite3的大量數據存儲的從正在運行的仿真幾個星期。但是我擔心有兩種情況。

我們最近有很多雷暴,這已經淘汰了幾次電源,我也更新了一些頻率寫入數據庫的文件,爲此我必須殺死當前運行模擬的線程。在這兩種情況下,尤其是前者,我擔心這個線程被中斷時會發生什麼。如果我在從日誌文件寫入數據庫的過程中偶然中斷或斷電,該怎麼辦?信息會不會到達那裏?它會到那裏但腐敗?它會損壞整個sqlite3數據庫文件?

基本上我想知道數據何時實際寫入文件而不僅僅是日誌文件。如果這個寫入過程沒有完成,日誌和數據庫文件會發生什麼變化?

〜n的

+0

http://www.sqlite.org/testing.html#ioerrtesting – msw 2010-06-28 16:39:41

回答

4

SQLite的使用atomic commits,所以無論是什麼都不要承諾。

如果您擔心數據庫處於無效狀態,則需要確保將整個「過渡」狀態包含在BEGIN TRANSACTION ... COMMIT塊中。

寫入日誌文件等(包括通過失敗)的詳細信息在文檔"File Locking and Concurrency in SQLite Version 3"中。

+0

當你說一切或沒有,這是否意味着如果我有1000-10000個新記錄提交(我的平均承諾的大小)是否它以某種方式承諾,如果說我在記錄573附近失去了力量,那麼沒有記錄會提交?還是它承諾記錄537,然後剩下的就會因停電而丟失? – Narcolapser 2010-06-28 16:45:08

+0

@Nacrolapser:如果那1000條新記錄在單個事務中,它們都不會在數據庫中結束(除非是事務日誌中的垃圾)。如果每個插入操作都在事務中,那麼失敗前的最後一次有效提交將出現在數據庫中。 – 2010-06-28 16:47:10

+0

只要你用「開始事務」......「提交」來包圍它,那麼數據庫就需要在事務內部進行所有的更新或者什麼都不做。不允許中間結果。這是全部或沒有。 – eemz 2010-06-28 16:47:37

相關問題