【发布时间】:2017-09-01 13:02:07
【问题描述】:
我有一个使用 LMDB 的应用程序。如果多个进程需要写入数据库,一次只允许运行一个,其余的则阻塞。因此,我想重写应用程序以使用客户端-服务器模型。
如果应用程序被编写为使用客户端-服务器模型,服务器可以管理写入并且其他进程不会阻塞。但是,如果一个客户端遇到错误必须回滚它的事务,它如何在不回滚其他客户端写的内容的情况下回滚它的数据呢?
我看过嵌套事务,但写事务可能只有一个嵌套事务。因此,虽然客户端可以将其数据写入嵌套事务并在发生错误时将其回滚,但一次只能运行一个客户端。因此,虽然这解决了回滚问题,但我们又回到了一个客户端一次只能写入的问题。
我还查看了 MDB_NOLOCK 选项,它会导致 LMDB 不会阻止您创建多个写入事务。当您尝试提交除第一个之外的任何事务时,它将返回错误。也许客户端可以将他们的写入汇集到他们自己的事务中,并且当他们准备好提交时,服务器会将条目转储到第一个写入事务中,但这很麻烦,我敢肯定这不是开发人员想要的用于。
我能想到的唯一其他解决方案是将客户端保留在单独的数据库中,这会取消切换到客户端-服务器模型的全部目的。
是否有任何其他方法可以允许不同的进程写入数据库,同时能够回滚一个客户端的数据而不回滚所有内容?
【问题讨论】: