mysql 锁相关知识

mysql 锁相关知识


  • 数据库级别
    • 全局锁:锁整个数据库,不可写,只读
      • 数据备份时,如果不加该锁,则可能导致数据不一致。
      • 加锁:flush tables with read lock;
      • 解锁 unlock tables;
  • 表级别
    • 表锁:
      • 表共享读锁(read lock):其他客户端不可写,只读
      • 表独占写锁(write lock):其他客户端不可读写
      • 加锁:lock tables 表名… read/write。
      • 释放锁:unlock tables / 客户端断开连接 。
    • 元数据锁:元数据-> 表结构数据
      • 为防止在数据更新时,对元数据更新,系统自己加的锁。

    查看锁情况 select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

    • 意向锁: 如果表有行锁,会自动加意向锁,为了减少表锁时候对每行检测是否具有行锁
      • 意向共享锁(IS): 由select ... lock in share mode添加。与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
      • 意向排他锁(IX): 由insert、update、delete、select...for update添加。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。

    查看锁情况: select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

  • 行级别
    • 行锁: 锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
      • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。[SELECT … LOCK IN SHARE MODE 加S]
      • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。 [INSERT,DELETE,UPDATE,SELECT … FOR UPDATE都会加X]
      • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

    查看锁情况: select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

    • 间隙锁: 锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。可多个事务共存间隙锁。
    • 临键锁: 行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
      • 向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。[锁最后一个值到无穷的间隙,防止事务过程中有数据插入]

      InnoDB的B+树索引,叶子节点是有序的双向链表,所以最右侧没有数据说明,找不到符合条件的数据,所以要锁空白记录

refer to https://juejin.cn/post/7208019379828621373

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值