Berkeley DB:散列访问方法的锁定对象数

时间:2010-08-01 20:01:56

标签: hash locking berkeley-db

此页面说“对于哈希访问方法,您只需要一个锁定对象”。

http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/lock_max.html

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

谢谢!

- 道之

1 个答案:

答案 0 :(得分:2)

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

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

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

每个数据库操作都需要

  • 正在访问的页面(Btree,Hash或Recno)或记录(队列)的一个锁定对象,
  • 加上元数据页面的一个锁定对象,
  • 加一个锁定对象如果需要Btree页面拆分,
  • 加上每页一个锁定对象如果正在使用队列

基本上,每次数据访问通常有2-3个锁定对象。事务累积锁定对象直到事务完成,因此如果应用程序中的事务通常访问10条记录,则该事务将需要20-30个锁定对象。如果您的应用程序中最多可以有10个并发线程,那么您需要将系统配置为具有大约300个锁定对象。配置超出您需要的总是更好,这样您就不会耗尽并且过度分配锁定对象的内存开销很小(它们是小型结构)。

我希望有所帮助。

戴夫