索引的锁和闩(Locking & Latching)
索引的锁和闩
索引作用
一种能够加快数据检索速度的数据结构,但是会占用额外的读写维护操作和存储空间。
索引实现
B树系列、哈希表等等。
这些别的地方说的比较多,我就不多提了。
索引锁
对于之前疏文章中提到的那些并发控制、多版本控制等,我们知道了如何使用锁来保护数据库的数据。但是对于索引,我们需要用别的方式和方法来对待它。
尽管索引的物理结构会发生改变,但是只要索引在逻辑层次上保持一致,就能够被使用者和开发者所接受。
举个简单的例子,我们读取数据的时候,并不关心它存储的位置或者索引指向的位置是哪里,我们只需要能够读取到正确的数据即可,就算因为插入了多个其他的数据,导致索引结构的改变,我们还是可以得到正确的数据。
锁和闩
锁
- 高层次,抽象
- 保护索引的逻辑内容不受其他txns的影响,从逻辑层面保护索引。
- 以txn为单位被保持。
- 需要能够回滚更改。
插销
- 低层次,具体
- 保护索引内部数据结构的关键部分不受其他线程影响,从物理层面保护索引。
- 以operation为单位被保持。
- 不需要能够回滚更改(或者说是不能通过回滚修改,因为底层不知道操作了啥,底层只知道有操作,知道操作的具体内容是高层的事情)。
在没有锁的情况下,事务就不通过锁去访问修改数据库,而是直接通过latches进行并发控制。
在没有闩的情况下,我们可以使用类似shadow paging等技术使得指针可以对数据进行原子操作,比如compare_and_swap(用于对特定内存地址进行值确认,如果确认成功则用新值覆盖,否则不做操作),但是我们也要通过locks来进行事务的并发控制。
因此没有一个数据库可以同时缺少这两种锁。