在特定情况下也可以使LMDB并发写入吗?

问题描述 投票:2回答:1

mdb_env_open() apidoc中所述为MDB_NOLOCK:

MDB_NOLOCK不执行任何锁定。如果预计会进行并发访问,则调用方必须自行管理所有并发。为了进行适当的操作,调用者必须执行单写者语义,并且必须确保在写者处于活动状态时,没有任何读者在使用旧事务。最简单的方法是使用排他锁,以便在编写者开始时根本没有任何读者处于活动状态。

  1. 如果RW txnA打算修改与另一个RW txnB打算修改的另一组密钥没有共同密钥的密钥集,该怎么办?它们不能同时发送吗?
  2. 单写者的语义在这种情况下不是浪费吗?尽管一个txn打算在lmdb环境中完全独立的区域中操作,但它们正在等待上一个txn结束。
  3. [在以MDB_NOLOCK打开的环境中,如果客户端应用程序在域中进行计算,那么打算在lmdb环境中的任意位置将两个写事务打算读写互斥的密钥集,并且无论如何只能同时发送此类事务?怎么可能出问题?
  4. 这样的并发写入是否可以随核心线性扩展?像RO TXN一样吗?假设该应用程序能够以3。
  5. 中所述的方式管理这些并发写入
lmdb
1个回答
0
投票
  1. 否,因为修改键/值对还需要修改b树结构,这两个事务会相互冲突。

  2. 您应避免在写事务中间进行长时间运行的计算。尝试事先做尽可能多的事情。如果您不能这样做,那么LMDB可能不适合您的应用程序。通常您可以。

  3. 非常糟糕的东西。应用程序崩溃和数据库损坏。

  4. 写入通常是受IO限制的,无论如何都无法与许多内核一起扩展。您可以使用LMDB的writemap和/或pwrite(2)进行一些非常棘手的操作,但是在这里您可以独自一人。

© www.soinside.com 2019 - 2024. All rights reserved.