MDB_NOLOCK 如所述mdb_env_open() http://www.lmdb.tech/doc/group__mdb.html#ga32a193c6bf4d7d5c5d579e71f22e9340 apidoc:
MDB_NOLOCK 不执行任何锁定。如果预期并发访问,调用者必须自行管理所有并发。为了正确操作,调用者必须强制执行单写入者语义,并且必须确保在写入者处于活动状态时没有读取者正在使用旧事务。最简单的方法是使用独占锁,这样当写入程序开始时,任何读取程序都不会处于活动状态。
- 如果 RW txnA 打算修改一组密钥,而该组密钥与另一个 RW txnB 打算修改的另一组密钥没有共同的密钥,该怎么办?不能同时发送吗?
- 对于这种情况,单作者语义不是浪费吗?由于一个 txn 正在等待前一个 txn 完成,即使它们打算在 lmdb 环境中完全独立的区域中操作。
- 在打开的环境中
MDB_NOLOCK
,如果客户端应用程序在域中计算出两个写入事务打算在 lmdb 环境中的任何位置读写互斥的密钥集,并且无论如何只同时发送此类事务,该怎么办?可能会出什么问题?
- 这种并发写入能否与核心线性扩展?就像 RO txns 一样吗?鉴于应用程序能够以 3 中描述的方式管理这些并发写入。
不可以,因为修改键/值对也需要修改b树结构,并且两个事务会相互冲突。
您应该避免在写入事务期间进行长时间运行的计算。尝试提前做尽可能多的事情。如果您不能做到这一点,那么 LMDB 可能不太适合您的应用程序。通常你可以。
非常糟糕的东西。应用程序崩溃和数据库损坏。
写入通常受 IO 限制,并且无论如何都无法扩展多个内核。您可以使用 LMDB 的 writemap 和/或 pwrite(2) 执行一些非常hacky 的操作,但您在这里只能靠自己了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)