首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在特定情况下,LMDB是否可以并发写入?

在特定情况下,LMDB是否可以并发写入?
EN

Stack Overflow用户
提问于 2020-01-19 07:31:12
回答 3查看 653关注 0票数 2

MDB_NOLOCK如开放() apidoc中所述:

MDB_NOLOCK不要做任何锁定。如果预期并发访问,则调用方必须管理所有并发性本身。为了进行正确的操作,调用方必须执行单写器语义,并且必须确保在编写器处于活动状态时,没有任何读取器正在使用旧事务。最简单的方法是使用独占锁,以便在作者开始时没有任何阅读器处于活动状态。

  1. 如果RW txnA打算修改一组没有键的密钥,而另一RW txnB打算修改另一组键,又该怎么办呢?不能同时发送吗?
  2. 对于这种情况,单作者的语义不是很浪费吗?因为一个txn正在等待上一个txn的完成,尽管他们打算在lmdb env中完全独立的区域中操作。
  3. 在使用MDB_NOLOCK打开的环境中,如果客户端应用程序在域中计算,两个写事务打算将RW发送到lmdb环境中任何地方的相互排斥的密钥集,并且只同时发送此类事务,该怎么办?会出什么问题呢?
  4. 这样的并发写比例尺能用核心线性地写吗?像RO txns那样?如果应用程序能够以3中描述的方式管理这些并发写操作。
EN

回答 3

Stack Overflow用户

发布于 2020-04-30 16:39:42

  1. 不是,因为修改键/值对还需要修改b-树结构,这两个事务将相互冲突。
  2. 您应该避免在写事务的中间进行长时间的计算。试着事先尽可能多地做。如果您不能这样做,那么LMDB可能并不适合您的应用程序。但通常你可以。
  3. 非常糟糕的事情。应用程序崩溃和DB损坏。
  4. 写通常是IO绑定的,而且无论如何也不会用许多内核进行缩放。对于LMDB的写地图和/或pwrite(2),您可以做一些非常麻烦的事情,但是您在这里非常独立。
票数 1
EN

Stack Overflow用户

发布于 2022-10-27 22:09:01

我将假设,写入预先存在的键的值部分并不会修改b树,因为您没有修改键。因此,道格·霍伊特( Doug )的评论站在什么位置,除了可能的第3点:

  1. 这里的关键短语是“正打算把RW变成相互排斥的一组键”。因此,假设键是预先分配的,并且已经在DB中,那么更改值就不重要了。我甚至不知道LMDB是否可以存储可变大小的值,在这种情况下,如果值是不同的大小,可能会很重要。

因此,只要您能够保证在并发写入期间永远不会修改、添加或删除任何键,就可以使用MDB_NOLOCK并发写入。

票数 1
EN

Stack Overflow用户

发布于 2022-11-20 15:38:12

根据经验,我可以说,使用MDB_NO_LOCK (或lock=False中的lock=False)打开LMDB,简单地修改预先存在的键的值,甚至只添加新的键/值,似乎效果很好。即使LMDB本身安装在NFS上,就像中型一样,并从不同的机器上查询。

@Doug -我希望更多地了解具体情况可能导致崩溃或腐败的具体情况。在我的例子中,有许多对同一个DB的短期小类型的写操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59808064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档