2014-10-08 129 views
0

我在具有多個線程但只有一個進程的環境中對事務使用Berkeley數據庫。Berkeley DB:在不讀取記錄的情況下鎖定記錄

因爲我只有一個進程,所以我想緩存來自某些記錄的數據的解析表示,以便我不必每次訪問時都不必要地重新解析它,但是如果我執行如果在訪問緩存數據時沒有發出任何數據庫操作,我會明顯不遵守鎖定協議,導致事務不能相互隔離。

我明顯可以通過在我打算在事務中使用的記錄上運行get操作來解決這個問題,但這在I/O方面似乎沒有必要,而且也很醜陋,因爲我實際上並不需要重新編譯,讀取數據。有沒有辦法鎖定「好像」我已發出get操作?

同樣,有沒有辦法做到相應的寫鎖put操作,因爲我需要修改的緩存數據(這需要以串行的數據實際上put它之前完成的)之前做呢?

回答

0

保持(分析)緩存與基礎數據庫存儲一致並不重要。 您是否考慮過直接在BerkeleyDB中保存已解析的數據以消除解析開銷?是的,這涉及模式更改,並且可能還需要更多的磁盤空間。

BerkeleyDB花費了一些時間來最大限度地減少mpool中的I/O,並且對於正確配置的數據庫應該接近最優。

如果使用事務,則在事務提交期間處理get/put操作之間的隔離,而不需要額外的鎖定。是的,提交可能會失敗或者打斷另一個提交。如果在更新記錄時需要排他性,則可以在放置記錄鍵上添加額外的鎖定層(使用BerkeleyDB鎖定子系統或任何您希望的)。

相關問題