2012-10-18 26 views
0

我們目前遇到在多用戶環境中使用SQLite進行數據庫鎖定的問題。由於日誌記錄已關閉以減少數據庫鎖定異常的數量,因此這些問題與常規數據庫畸形問題相結合。SQLite數據庫鎖定 - 兩行數據庫實時同步UPDATEs/INSERTs

我的同事目前正在實現一種同步算法,以允許用戶在本地SQLite數據庫上工作,並將該數據在瞬間傳輸到網絡上的主數據庫。

當本地行更改時,Sync標誌設置爲true。同步算法由每秒運行一次的定時器觸發,並由兩種方法組成:上傳和下載。下面提到的任何SQL命令都是使用String.Format構建的。

在上傳期間,會掃描本地數據庫中同步標誌爲真的行。像這樣的每一行都被更新或插入主數據庫(取決於是否可以使用相同的PK找到一行)。

在下載過程中,每個本地表都逐字段逐字段地與主數據庫中的相應表進行比較(兩個表都作爲數組結構加載到內存中以加快比較速度)。如果發現任何差異或者本地行丟失,則使用來自主數據庫的數據更新/插入本地行

忽略這樣一個明顯的事實,即這不能解決我們的鎖定/畸形問題,我的直覺告訴我這是一個可怕的想法,但我很難解釋這個問題。有沒有人可以提供一些理由,爲什麼這會是一個可怕的想法,或者是我忽視的一些積極因素。

+0

什麼文件共享protocl? NFS? SMB(Windows)?而「journalling」,你的意思是'journal_mode'不是'WAL'或'OFF'? –

+0

文件共享協議是SMB,並且沒有日誌記錄是'journal_mode = OFF' – pixelbadger

回答

1

關閉日誌並不會減少鎖定衝突的次數,它只是將鎖定異常轉換爲保證數據庫損壞。

處理鎖定衝突的正確方法是等待,直到其他連接完成更改。在使用System.Data.SQLite時,可以在連接字符串中將其設置爲Default Timeout,默認值爲30秒(我不知道XPO使用哪種驅動程序)。 如果這不能爲您提供足夠的併發性,您應該切換到客戶端/服務器數據庫,如MySQL或PostgreSQL。

同步下載很愚蠢:無論如何您正在讀取整個數據庫,因此將整個數據庫文件複製到本地計算機會更容易,更快速。


如果你認爲從The Authorities一個字可能說服你的PHB的更大的機會,請在sqlite-users mailing list這個問題。