2

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

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

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

谢谢!

——美智

4

1 回答 1

2

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

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

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

每个数据库操作都需要

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

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

我希望这会有所帮助。

戴夫

于 2010-08-16T20:28:39.830 回答