2009-08-24 89 views
1

我有一個sqlite數據庫,並且我希望在數據庫文件沒有任何寫操作的情況下保持它爲只讀。帶有臨時更改的只讀sqlite數據庫

有沒有辦法對數據庫進行臨時修改,而不會永久刷新到磁盤?

現在,我正在通過將臨時數據存儲在具有與主數據庫文件相同架構結構的內存數據庫中的方法來解決此問題。這種方法的問題在於它增加了代碼的複雜性,因爲我必須在兩個數據庫上運行所有查詢。

理想情況下,問題的解決方案會將附加的臨時數據視爲它是主數據庫的一部分,但不實際將其提交到磁盤。

回答

2

因爲SQLite is transactional它應該足以不到COMMIT事務(SQLite將在連接關閉時自動回滾它)。您應首先使用BEGIN聲明將自動提交設置爲關閉。

1
BEGIN IMMEDIATE TRANSACTION; 
do a bunch of stuff; 
ROLLBACK TRANSACTION; 

如果另一個線程從數據庫中讀取,則ROLLBACK將失敗,SQLITE_BUSY,但懸而未決的讀取完成後,就可以再次執行它。如果另一個線程想寫入數據庫,那麼他們會打你的鎖。

現在,以這種方式使用事務有點有趣,如何在您和數據庫之間使用編程式ORM樣式的層直接與本地對象一起工作並保持內存中的臨時更改?

我的意思是,如果你不想更改數據庫,也許你需要另一個代碼層,而不是數據庫功能?