数据库

数据库里的 lock 和 latch 不是一回事

操作系统里说的「锁」(mutex、rwlock),在数据库里叫 latch。数据库说的 lock 是更高一层的东西。

locklatch
谁持有事务线程
保护什么逻辑数据:行、范围、表内存里的结构:B+ 树的页、哈希表、锁表本身
持有多久到事务提交临界区,几微秒
模式共享、排他、意向锁……读、写
死锁怎么办检测出来,回滚一个事务靠固定的加锁顺序避免,没有回滚

InnoDB 的一条 UPDATE 两种都拿:从根往下逐页拿页 latch,到叶子后加行 lock;改完就放页 latch,行 lock 留到 COMMIT。等行锁之前必须先放掉页 latch,否则整页都会被堵住。

这个区分在别处也适用:Go 里保护 map 的 sync.Mutex 是 latch;订单「处理中」的行锁、Redis 分布式锁是 lock。通用的一条规则:拿着短锁时别去等长锁,比如持着 Mutex 发 RPC,或者开着事务去调外部 HTTP。

注意 Java 的 CountDownLatch 是倒数闸门,和这里的 latch 不是一个意思。

esc