在并发访问数据库的上下文中,锁和锁存器之间有什么区别?

Vie*_*ele 34 database concurrency locking

我试图理解一篇关于并发B树的论文,其中作者提到了latch vs lock,以及latch如何不需要"Lock Manager".我一直试图弄清楚这两者之间的差异是两天.

谷歌导致:

"锁保证数据的逻辑一致性.它们通过锁表实现,长时间保持(例如2PL),以及部分死锁检测机制.

锁存器就像信号量.它们确保数据和资源的物理一致性,这在交易级别是不可见的"

但是,我仍然很困惑.有人可以详细说明这个吗?锁经理到底做了什么?

提前谢谢〜

use*_*322 27

从CMU 15 - 721(2016年春季),讲座6演示,幻灯片25和26,引用Goetz Graefe 的B树锁定技术调查:

锁定
→保护索引的逻辑内容与其他txns.
→持续txn持续时间.
→需要能够回滚更改.

锁存器
→保护索引内部数据结构的关键部分与其他线程.
→持续运行时间.
→不需要能够回滚更改.

锁和闩锁


Mat*_*ish 10

这实际上取决于您的DBMS,但这是Oracle的一个很好的解释.

http://www.dba-oracle.com/t_lru_latches.htm

锁存器类似于RAM存储器结构的锁,以防止并发访问并确保内核代码的串行执行.在从缓冲区高速缓存中查找,添加或删除缓冲区时使用LRU(最近最少使用的)锁存器,该操作一次只能由一个进程完成.


LCJ*_*LCJ 6

以下是从SQL Server 的角度。

锁存器是短期的轻量级同步对象。与锁不同,锁存器不会一直保持到整个逻辑事务。他们只持有page.

引擎使用闩锁来同步多个线程(例如尝试在表上插入)。锁存器不是为开发人员或应用程序设计的——它是由引擎来完成它的任务的。锁存器是内部控制机制。而锁是供开发人员和应用程序控制的。锁存器用于内部存储器一致性。锁用于逻辑事务一致性。

锁存器引起的等待对于诊断性能问题非常重要。查看诊断和解决 SQL Server 上的闩锁争用 - 白皮书。这PAGEIOLATCH_EX是一种重要的等待类型。

参考

  1. SQL Server 闩锁及其对性能问题的指示
  2. 膝跳等待统计:PAGELATCH
  3. SQL Server 内部:索引和锁定


vim*_*vim 5

闩锁的另一个名称是“自旋锁”。这是一个简单的“while 循环”,直到位为零(取决于实现)。当闩锁不可用时,执行线程永远不会休眠。没有任何队列。自旋锁对于短时内存对象锁定很有用,但如果持有时间较长则浪费。请参阅维基百科上“自旋锁”文章

系统通常支持锁,如果它们被占用,您的线程将进入睡眠状态,因此它不会消耗任何处理器资源。每个锁保持所有挂起线程的内部队列。

锁管理器是一个子系统,它可以为您提供自旋锁作为并发支持的重量级锁。

另请参阅Tom Kyte 撰写的关于闩锁和锁文章