【问题标题】:Can LMDB be made concurrent for writes as well under specific circumstances?在特定情况下,LMDB 是否也可以并发写入?
【发布时间】:2020-01-19 07:31:12
【问题描述】:

MDB_NOLOCK 如mdb_env_open() apidoc 所述:

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

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

【问题讨论】:

    标签: lmdb


    【解决方案1】:
    1. 不可以,因为修改键值对也需要修改b-tree结构,两个事务会相互冲突。

    2. 您应该避免在写入事务的中间进行长时间运行的计算。尽量提前做。如果您不能这样做,那么 LMDB 可能不适合您的应用程序。通常你可以。

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

    4. 写入通常受 IO 限制,并且无论如何都不会与许多内核一起扩展。您可以使用 LMDB 的 writemap 和/或 pwrite(2) 做一些非常老套的事情,但在这里您只能靠自己。

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2021-10-22
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多