Hash Berkeley DB:哈希访问方法的锁对象数

Hash Berkeley DB:哈希访问方法的锁对象数,hash,locking,berkeley-db,Hash,Locking,Berkeley Db,这个页面说“对于散列访问方法,您只需要一个锁对象” 这是否意味着访问数据库的所有进程/线程都将尝试锁定同一个锁对象?它不会导致非常高的锁争用吗 谢谢 --Michi这里描述的是如何计算应用程序所需的锁对象数量,尽管默认的锁对象配置(1000)通常就足够了。它描述了一个给定的单个数据访问操作将需要多少个锁对象,这样您就可以将其乘以并发数据访问操作的数量,并适当地配置锁对象的数量。它并不是真的在谈论锁争用 对于哈希访问方法,给定的键值直接映射到哈希桶。只有一个页面需要查看(并锁定)才能访问数据。这

这个页面说“对于散列访问方法,您只需要一个锁对象”

这是否意味着访问数据库的所有进程/线程都将尝试锁定同一个锁对象?它不会导致非常高的锁争用吗

谢谢


--Michi

这里描述的是如何计算应用程序所需的锁对象数量,尽管默认的锁对象配置(1000)通常就足够了。它描述了一个给定的单个数据访问操作将需要多少个锁对象,这样您就可以将其乘以并发数据访问操作的数量,并适当地配置锁对象的数量。它并不是真的在谈论锁争用

对于哈希访问方法,给定的键值直接映射到哈希桶。只有一个页面需要查看(并锁定)才能访问数据。这与Btree(需要遍历内部索引节点才能访问数据)和Queue(需要锁定每条记录和记录所在的页面)不同

在最近的版本中,我们实际上消除了一些不需要的锁,因此更简单的方法是:

每个数据库操作都需要

  • 正在访问的页面(Btree、Hash或Recno)或记录(Queue)的一个锁对象
  • 加上元数据页的一个锁对象
  • 加上一个锁定对象(如果需要Btree页面拆分)
  • 如果正在使用队列,则每页加一个锁对象
基本上,每次数据访问通常会锁定2-3个对象。事务累积锁对象直到事务完成,因此如果应用程序中的事务通常访问10条记录,则该事务将需要20-30个锁对象。如果应用程序中最多可以有10个并发线程,那么需要将系统配置为有大约300个锁对象。最好配置比您需要的更多的锁对象,这样您就不会耗尽资源,并且过度分配锁对象的内存开销也是最小的(它们是小结构)

我希望这有帮助

戴夫