InnoDB 锁数管理据结构




  • 对于表锁, InnoDB一般只是获取意向锁(意向共享锁LOCK_IS和意向排它锁LOCK_IX),一般不会去获取共享锁(LOCK_S)和排它锁(LOCK_X)。除非明确的执行LOCK TABLE 命令。一个例外是在在线ALTER TABLE命令的准备阶段,一个表将会被共享锁(LOCK_S) 锁住。
  • Lock bitmap用于表示行锁,紧邻lock struct存放,每bit代表页内1行数据,使用heap_no对应; 例如bitmap的第5位如果激活,则表明heap_no=5的行被锁定.
  • 隐式锁(cluster index) :隐式锁是逻辑上的一个概念,判断一个记录是否有隐式锁是通过记录中的TRX_ID来判断的,每个记录都有是个TRX_ID,判断记录上的TRX_ID是否是活动的,就可以判断是个记录上是否有隐式锁的存在(即TRX_ID是否在trx_sys->trx_list链表中,这个链表是按TRX_ID从大到小排序的,如果记录中的TRX_ID大于最小的活动的事务的TRX_ID,说明这个是否已经终止了,否则判断这个事务的状态:TRX_ACTIVE, TRX_PREPARED),见函数 lock_clust_rec_some_has_impl()  
  • 对于表锁,采用双向链表来管理,所有在同一表上的申请锁都用双向链表lock_table_t->locks连接起来,新创建的锁都加到链表的尾部。
  • 对于行锁,采用哈希来管理,所有的锁都用space, page_no和bitmap来表示相应的行,因此在相同的行的所有锁是,需要表里以space和page_no作为哈希key的相应桶中的所有列, 同一页上的所有记录的锁就一定在同一个哈希桶中,这样检查死锁就可以遍历这个哈希桶中的锁,找到对应记录的锁。

  • 对于表锁, InnoDB一般只是获取意向锁(意向共享锁LOCK_IS和意向排它锁LOCK_IX),一般不会去获取共享锁(LOCK_S)和排它锁(LOCK_X)。除非明确的执行LOCK TABLE 命令。一个例外是在在线ALTER TABLE命令的准备阶段,一个表将会被共享锁(LOCK_S) 锁住。
  • Lock bitmap用于表示行锁,紧邻lock struct存放,每bit代表页内1行数据,使用heap_no对应; 例如bitmap的第5位如果激活,则表明heap_no=5的行被锁定.
  • 隐式锁(cluster index) :隐式锁是逻辑上的一个概念,判断一个记录是否有隐式锁是通过记录中的TRX_ID来判断的,每个记录都有是个TRX_ID,判断记录上的TRX_ID是否是活动的,就可以判断是个记录上是否有隐式锁的存在(即TRX_ID是否在trx_sys->trx_list链表中,这个链表是按TRX_ID从大到小排序的,如果记录中的TRX_ID大于最小的活动的事务的TRX_ID,说明这个是否已经终止了,否则判断这个事务的状态:TRX_ACTIVE, TRX_PREPARED),见函数 lock_clust_rec_some_has_impl()  
  • 对于表锁,采用双向链表来管理,所有在同一表上的申请锁都用双向链表lock_table_t->locks连接起来,新创建的锁都加到链表的尾部。
  • 对于行锁,采用哈希来管理,所有的锁都用space, page_no和bitmap来表示相应的行,因此在相同的行的所有锁是,需要表里以space和page_no作为哈希key的相应桶中的所有列。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值