innodb隐式锁和显示锁
innodb引擎中, 锁是根据也的组织形式来进行管理的. 若要知道页中某一条记录是否已经有锁,则通过位图的方式, 位图中的索引与记录的heap no一一对应. 行锁在innodb存储引擎中的定义如下
struc lock_reck_struct{
ulint space;
ulint page_no;
ulint n_bits;
}
假设页中有250调记录,变量n_bit=250+64(额外预留的)=314,那么实际位图需要40个字节用户位图的管理, 若页中heap_no为2,3,4的记录都已经上锁,则对应的数据结构lock_rec_t 在内存中的关系如下图
如果需要查询某一行记录是否有锁,首先是根据行所在的页进行哈希查询,然后再根据查询得到的lock_rec_t,扫描bitmap, 才能最终得到该行记录是否有锁, 使用这种方式的锁查询并不高效,但是锁的开销非常小
在innodb引擎中存在两种属性的锁, 显示锁和隐性锁;
隐式锁是指在索引记录逻辑上有x-lock, 但是在实际内存对象中并不含有这个锁信息. 只有当产生锁等待时, 隐式锁转化为显式锁.
验证如下:
在事务一中, 先执行一个update, 执行SELECT * FROM information_schema.INNODB_LOCKS
发现输出为空
接着在事务二中执行update, 当前事务被阻塞, 执行SELECT * FROM information_schema.INNODB_LOCKS
输出结果如下