我正在尝试理解关于并发B树的论文,其中作者提到了latch vs lock,以及latch如何不需要“Lock Manager”。我一直试图弄清楚这两者之间存在两天的差异。
Google导致:
“锁定确保数据的逻辑一致性。它们通过锁定表实现,持续很长时间(例如2PL),以及部分死锁检测机制。
锁存器就像信号量。它们确保数据和资源的物理一致性,这在交易级别是不可见的“
然而,我仍然很困惑。有人可以详细说明这个吗?锁经理到底做了什么?
提前致谢〜
答案 0 :(得分:23)
来自CMU 15-721(2016年春季),讲座6演示,幻灯片25和26,引用Goetz Graefe的 A Survey of B-Tree Locking Techniques :
锁定
→保护索引的逻辑内容不受其他txns的影响。
→持续txn持续时间
→需要能够回滚更改。
<强>栓强>
→保护索引内部数据结构的关键部分与其他线程保持一致
→持续运行时间
→不需要能够回滚更改
答案 1 :(得分:11)
这实际上取决于您的DBMS,但这是Oracle的一个很好的解释。
http://www.dba-oracle.com/t_lru_latches.htm
锁存器类似于RAM存储器的锁 结构以防止并发 访问并确保串行执行 内核代码。 LRU(最近最少 使用时)在寻求时使用锁存器, 添加或删除缓冲区 缓冲区缓存,只能执行的操作 一次完成一个过程。
答案 2 :(得分:3)
latches的其他名称是'spin lock'。它很简单'while循环'直到bit为零(取决于实现)。如果锁存器现在不可用,则执行线程永远不会休眠。没有任何队列。对短时内存对象锁定很有用。如果持续很长时间会浪费。 见Spinlock article
通过系统锁定usualy支持,如果它忙,你的线程将在不消耗任何处理器资源的情况下休眠。在内部,每个锁都有一个包含所有挂起线程的队列。
锁定管理器是一个子系统,它可以为您提供自旋锁,作为用于并发支持的重量级锁。
请参阅Tom Kyte的article关于锁存和锁定的信息
答案 3 :(得分:2)
以下是来自 SQL Server 的观点。
锁存器是短期轻量级同步对象。与锁不同,锁存器在整个逻辑事务之前不会保持不变。他们仅持有page
上的操作。
引擎使用锁存器来同步多个线程(例如,尝试在表上插入)。锁存器不适用于开发人员或应用程序 - 引擎可以执行此任务。锁存器是内部控制机制。而锁是供开发人员和应用程序控制的。锁存器用于内部存储器一致性。锁用于逻辑事务一致性。
锁存器引起的等待对于诊断性能问题非常重要。看看Diagnosing and Resolving Latch Contention on SQL Server - Whitepaper。 PAGEIOLATCH_EX
是一种重要的等待类型。
参考
答案 4 :(得分:1)
锁和锁存器之间的差异:
Reference taken from this blog.
锁定确保不能通过两个不同的连接修改相同的记录,并且锁存器确保记录驻留在适当的数据页面中以进行进一步的读写操作。
锁定提供逻辑事务的一致性,锁存器提供内存区域的一致性。
DBA可以通过应用不同的隔离级别来控制和管理数据库锁,对于锁存器,DBA没有任何控制,因为它由SQL Server管理。
答案 5 :(得分:1)
Stonebraker等人从OLTP Through the Looking Glass, and What We Found There引用
锁定。传统的两阶段锁定会产生相当大的开销,因为对数据库结构的所有访问都由一个单独的实体Lock Manager控制。
锁存。在多线程数据库中,必须先锁存许多数据结构才能访问它们。删除此功能并采用单线程方法会对性能产生显着影响。
然后,该解释将锁定与数据库级对象相关联,例如行,而锁存器在较低级别的数据结构中运行。
答案 6 :(得分:0)
根据论文Architecture of a Database System p223。
锁在许多方面与锁不同:
锁保存在锁表中并通过哈希表定位;锁存器位于它们保护的资源附近的内存中,并可以通过直接寻址进行访问。
在严格的2PL实现中,锁受严格的2PL协议约束。可以在交易过程中根据特殊情况的内部逻辑来获取或删除闩锁。
锁获取完全由数据访问驱动,因此锁获取的顺序和生存期在很大程度上由应用程序和查询优化器控制。闩锁是由DBMS内部的专用代码获取的,并且DBMS内部代码会发出闩锁请求并有策略地予以释放。
允许锁产生死锁,并通过事务重启来检测并解决锁死锁。必须避免闩锁死锁;闩锁死锁的出现表示DBMS代码中的错误。
闩锁是使用原子硬件指令实现的,或者在极少数情况下不可用,是通过OS内核中的互斥来实现的。
闩锁调用最多需要几十个CPU周期,而锁定请求则需要数百个CPU周期。
锁管理器跟踪事务持有的所有锁,并在事务引发异常的情况下自动释放锁,但是操作锁存器的内部DBMS例程必须仔细跟踪它们,并包括手动清除作为其异常的一部分处理。
未跟踪闩锁,因此如果任务发生故障,将无法自动释放。
答案 7 :(得分:0)
可以在数据库实体上添加锁,例如元组,交易。
可以在带下划线的数据表示形式上添加锁,例如内存中的页表,它将页标识符映射到特定框架。