8-Index Concurrency

8.0 Concurrency control

8.1 Latch

8.1.0 LOCKS VS. LATCHES


8.1.1 Latch Modes

8.1.2 Latch implementations

Test-and-Set Spin Latch (TAS)

有效,不能支持大规模并发;对缓存不友好;对 OS 不友好

std::atomic

CPU 空转,因为 NUMA 之间的通信,会增加硬件通信流量成本

std::atomic_flag latch;
while(latch.test_and_set(...){
// Retry? Yield? Abort?
})

Blocking OS Mutex:阻塞式实现;不能大规模并发;std::mutex

OS 支持,竞争线程进入内核态类似 sleep

涉及到 OS 的系统调用,可能会拖慢整个系统的速度

Reader-Writer Latches

允许并发读

依据 spin latches 实现

8.2 Hash table latching

  • 对一个哈希结构加锁
  • 对一个哈希槽进行加锁

Compare-and-swap (CAS)

原子操作,对变量地址中的值进行改变

8.3 B+ Tree Concurrency Control

latch crabbing/coupling

释放 Latch 时,我们希望尽可能将阻塞更多线程的 latch 释放,所以我们总是自顶向下释放 latch

Better Latching Algorithm

是乐观机制;在 split 和 merge 发生情况较少下效果更好。

先采用一路读锁到叶子节点的上一个节点,如果出现 split 或 merge,重新从头开始进行悲观锁加锁

multithread 并发冲突

T2 不知道 T1 发生了什么,确定 T1 的完成时间并等待是不现实的;实现线程间通信也是成本很高的;最佳选择是终止自己的事务并重新开始

这种竞态条件出现较为罕见;而且预防该种竞态条件成本高昂,一般方式采用双方事务都直接终止并重启