您现在的位置是:首页 >其他 >mysql 锁相关知识网站首页其他

mysql 锁相关知识

simple哇 2024-07-17 18:01:02
简介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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。