我有一個使用LMDB的應用程序。如果多個進程需要寫入數據庫,則一次只允許一個進程運行,其餘的進程將被阻止。正因爲如此,我想重寫應用程序以使用客戶機 - 服務器模型。LMDB:回滾事務而不回滾所有內容
如果應用程序編寫爲使用客戶端 - 服務器模型,則服務器可以管理寫入,而其他進程不會阻止。但是,如果客戶端遇到錯誤並且必須回滾事務,那麼它如何回滾其數據而無需回滾其他客戶端寫入的內容?
我看過嵌套事務,但寫入事務可能只有一個嵌套事務。因此,儘管客戶端可以將其數據寫入嵌套事務並在發生錯誤時將其回滾,但一次只能運行一個客戶端。因此,儘管解決了回滾問題,但我們又回到了一次只有一個客戶端可以寫入的問題。
我也看了一下MDB_NOLOCK選項,這會導致LMDB不會阻止您創建多個寫入事務。當您嘗試提交除第一個事務之外的任何事務時,它將返回一個錯誤。也許客戶可以把他們的寫入彙集到他們自己的事務中,當他們準備提交時,服務器將把這些條目轉儲到第一次寫入事務中,但這很冒險,我確信這不是開發人員想要的被用於。
我能想到的唯一的另一個解決方案是將客戶端保存在一個單獨的數據庫中,這就解除了切換到客戶端 - 服務器模型的全部目的。
有沒有其他方法可以讓不同的進程寫入數據庫,同時能夠回滾一個客戶端的數據而不需要回滾一切?