2010-11-11 72 views
3

我有2個進程都訪問sqlite3數據庫。雖然讀取在sqlite中不是問題,但只有一個進程可以寫入數據庫。根據常見問題解答: http://www.sqlite.org/faq.html#q5 sqlite使用讀寫器鎖。sqlite:檢查讀寫器鎖

如何檢查數據庫是否被另一個進程鎖定,無論是從Python還是C++?

我的意思是執行一個查詢是一個選項,但它需要性能取決於查詢。所以問題也是我用什麼類型的查詢來最小化這種影響。我也想自己鎖定/解鎖數據庫。

回答

2

當SQLite試圖訪問一個鎖定的數據庫時,它的默認行爲是返回SQLITE_BUSY。該文檔介紹瞭如何爲此事件添加自定義處理:http://www.sqlite.org/faq.html#q5

我從文檔中瞭解到,您調用的任何函數試圖寫入此鎖定的數據庫將僅返回SQLITE_BUSY,並且這將是您的通知數據庫已被鎖定。

如果您擔心執行的寫操作不會完成,您可以實施繁忙處理程序回調(sqlite3_busy_handler),並結合繁忙超時(sqlite3_busy_timeout),該操作會在x毫秒後重試寫入操作。

http://www.sqlite.org/c3ref/io_methods.html中,它提到了函數指針的結構,其中一個是xCheckReservedLock(),如果文件被鎖定,則返回true。在這個結構中是所有其他與鎖相關的函數。我不確定從sqlite庫外部訪問這些文件,但這可能是值得研究的。我認爲你通過這個界面來做到這一點:http://www.sqlite.org/c3ref/file_control.html

+0

我實際上鍊接到我的問題常見問題。我想知道的事情仍然是如何檢查數據庫是否被鎖定。我的意思是執行一個查詢是一個選項,但它取決於查詢的性能。所以問題也是我用什麼類型的查詢來最小化這種影響。我也想自己鎖定/解鎖數據庫。我可能應該在問題上更清楚。 – 2010-11-11 10:20:39

+0

在http://www.sqlite.org/c3ref/io_methods.html中,它提到了函數指針的結構,其中一個是xCheckReservedLock(),如果文件被鎖定,則返回true。在這個結構中是所有其他與鎖相關的函數。我不確定從sqlite庫外部訪問這些文件,但這可能是值得研究的。我認爲你通過這個界面來做到這一點:http://www.sqlite.org/c3ref/file_control.html – badgerr 2010-11-11 13:20:33

+0

我以另一種方式解決了這個問題,所以我不確定你的提案是否真的有效,但你努力回答這個問題所以我會把它標記爲正確的 – 2011-01-27 14:35:20