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

2023-12-22

MDB_NOLOCK 如所述mdb_env_open() http://www.lmdb.tech/doc/group__mdb.html#ga32a193c6bf4d7d5c5d579e71f22e9340 apidoc:

MDB_NOLOCK 不执行任何锁定。如果预期并发访问,调用者必须自行管理所有并发。为了正确操作,调用者必须强制执行单写入者语义,并且必须确保在写入者处于活动状态时没有读取者正在使用旧事务。最简单的方法是使用独占锁,这样当写入程序开始时,任何读取程序都不会处于活动状态。

  1. 如果 RW txnA 打算修改一组密钥,而该组密钥与另一个 RW txnB 打算修改的另一组密钥没有共同的密钥,该怎么办?不能同时发送吗?
  2. 对于这种情况,单作者语义不是浪费吗?由于一个 txn 正在等待前一个 txn 完成,即使它们打算在 lmdb 环境中完全独立的区域中操作。
  3. 在打开的环境中MDB_NOLOCK,如果客户端应用程序在域中计算出两个写入事务打算在 lmdb 环境中的任何位置读写互斥的密钥集,并且无论如何只同时发送此类事务,该怎么办?可能会出什么问题?
  4. 这种并发写入能否与核心线性扩展?就像 RO txns 一样吗?鉴于应用程序能够以 3 中描述的方式管理这些并发写入。

  1. 不可以,因为修改键/值对也需要修改b树结构,并且两个事务会相互冲突。

  2. 您应该避免在写入事务期间进行长时间运行的计算。尝试提前做尽可能多的事情。如果您不能做到这一点,那么 LMDB 可能不太适合您的应用程序。通常你可以。

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

  4. 写入通常受 IO 限制,并且无论如何都无法扩展多个内核。您可以使用 LMDB 的 writemap 和/或 pwrite(2) 执行一些非常hacky 的操作,但您在这里只能靠自己了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在特定情况下,LMDB 是否也可以并发写入? 的相关文章

随机推荐