December 20, 2012

[MySQL 学习] Innodb锁系统(2)关键函数路径

前提: 以下分析基于标准的配置选项: tx_isolation = REPEATABLE-READ innodb_locks_unsafe_for_binlog = OFF lock->type_mode用来表示锁的类型,实际上lock->type_mode包含了几乎所有锁的模式信息,例如锁类型判断是X锁还是S锁 lock->type_mode &LOCK_TYPE_MASK LOCK_MODE_MASK 0xFUL 用于表示锁模式掩码 LOCK_TYPE_MASK 0xF0UL 用于表示锁类型,LOCK_TABLE或者LOCK_REC LOCK_WAIT 256 表示需要锁等待,还没有获得锁,只是在等待队列中等待 LOCK_ORDINARY 0 普通的next-key锁,锁记录,并锁记录前面的gap,这样可以防止幻读。 假设索引包括10,11,13,20,则next-key锁为: (negative infinity, 10], (10, 11], (11, 13], (13, 20], (20, positive infinity) 我们经常在innodb_locks表中看到的supremum pseudo-record就是锁住了最大值往后的gap. LOCK_GAP 512 只持有记录前的gap锁,例如,在一个gap上的x锁无法修改bit被设置的记录 在从索引记录链上移除记录时会加该类型的锁。 LOCK_REC_NOT_GAP 1024 也就是普通记录锁,只锁住记录,因此不会阻塞向该记录之前的gap中插入记录。 LOCK_INSERT_INTENTION 2048 插入意图锁,目的是让插入索引记录时等待,直到在gap上没有其他冲突的锁 记住,即使获得了等待的锁,也依然会持有插入意图锁 不同锁模式 enum lock_mode {     LOCK_IS = 0, /* […]