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

输出结果如下

 

posted @ 2019-03-15 16:11  車輪の唄  阅读(12)  评论(0编辑  收藏  举报  来源