2012-03-28 87 views
9

假設有兩個python腳本想要使用sqlite3模塊將數據寫入存儲在SQLite文件中的同一個表中。 SQLite文件存儲在NFS文件系統中。在SQLite-FAQ我讀到:鎖定NFS文件系統上的sqlite文件可能嗎?

SQLite使用讀寫器鎖來控制對數據庫的訪問。 [...]但請小心:如果數據庫文件保存在NFS文件系統上,則此鎖定機制可能無法正常工作 。這是因爲在許多NFS實現上, fcntl()文件鎖定被破壞。如果多個進程可能嘗試同時訪問文件,您應該避免將SQLite數據庫文件放在NFS上。

這是否意味着它根本不可能或者有某種方法可以確保一個進程等到另一個進程完成?

INSERTs並不複雜。只是一些:

INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)" 
connection.executemany(INSERT_STATEMENT, triples) 

而插入的集合是不相交的。

還有一個問題:當兩個進程試圖寫入同一個表或者他們試圖寫入同一個數據庫(這是一個文件)時,NFS問題是否會發生?是否讓每個進程都在同一個數據庫(文件)中創建自己的表並寫入該表?

回答

19

不要在SQL中使用SQLite。它是如此簡單。 NFS語義與普通文件系統不同,並且更鬆散。你最終會得到腐敗。每隔一段時間,SQLite用戶郵件列表上的人員都會發布他們的「解決方法」。儘管他們看起來很短,但他們從不工作。

+7

聽這個人。 [他是一個權威。](http://code.google.com/p/apsw/) – 2012-04-01 10:22:50

+1

不幸的是我必須使用SQLite。我最終給每個進程自己的文件寫入,然後合併腳本。但是,謝謝你的回答! :-) – Aufwind 2012-04-02 11:15:45

+4

當你最終得到腐敗時,確保提及你使用了NFS。當所有人的迴應是「不這樣做」時,不要感到驚訝。 – 2012-04-02 20:39:00