高级数据库七:索引的锁和闩

本文深入探讨数据库索引的锁(Locking)和闩(Latching)机制,包括它们的作用、实现方式及不同类型的锁。索引锁用于保护逻辑内容,而闩则保护物理数据结构。文章讨论了不同类型的锁实现,如Blocking OS Mutex、Test-and-Set Spinlock、Queue-based Spinlock和Reader-Writer Locks,并解释了如何在B+树中应用Latch Crabbing策略。此外,还介绍了各种索引锁的实现,如Predicate Locks、Key-Value Locks、Gap Locks、Key-Range Locks和Hierarchical Locking。
摘要由CSDN通过智能技术生成

索引的锁和闩(Locking & Latching)

索引的锁和闩

索引作用

一种能够加快数据检索速度的数据结构,但是会占用额外的读写维护操作和存储空间。

索引实现

B树系列、哈希表等等。

这些别的地方说的比较多,我就不多提了。

索引锁

对于之前疏文章中提到的那些并发控制、多版本控制等,我们知道了如何使用锁来保护数据库的数据。但是对于索引,我们需要用别的方式和方法来对待它。

尽管索引的物理结构会发生改变,但是只要索引在逻辑层次上保持一致,就能够被使用者和开发者所接受。

举个简单的例子,我们读取数据的时候,并不关心它存储的位置或者索引指向的位置是哪里,我们只需要能够读取到正确的数据即可,就算因为插入了多个其他的数据,导致索引结构的改变,我们还是可以得到正确的数据。

锁和闩

  • 高层次,抽象
  • 保护索引的逻辑内容不受其他txns的影响,从逻辑层面保护索引。
  • 以txn为单位被保持。
  • 需要能够回滚更改。

插销

  • 低层次,具体
  • 保护索引内部数据结构的关键部分不受其他线程影响,从物理层面保护索引。
  • 以operation为单位被保持。
  • 不需要能够回滚更改(或者说是不能通过回滚修改,因为底层不知道操作了啥,底层只知道有操作,知道操作的具体内容是高层的事情)。

图1

在没有锁的情况下,事务就不通过锁去访问修改数据库,而是直接通过latches进行并发控制。
在没有闩的情况下,我们可以使用类似shadow paging等技术使得指针可以对数据进行原子操作,比如compare_and_swap(用于对特定内存地址进行值确认,如果确认成功则用新值覆盖,否则不做操作),但是我们也要通过locks来进行事务的并发控制。

因此没有一个数据库可以同时缺少这两种锁。

闩的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值