type
status
date
slug
summary
tags
category
icon
password
增删改 都会加锁,查不会(通过MVCC实现)

1. 全局锁

  • 语句
     
    • 效果
      • 执行后,整个数据库就处于只读状态了
     
    • 目的
      • 这个库的全库逻辑备份
     
    • 加全局锁实现全库逻辑备份局限性
      • 影响业务连续性。因为全库只读。
     
    • 实现全库逻辑备份的另一种方式
      • 那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
     
     

    2. 表级锁[共享锁、独占锁]

    • 分类
      • 表锁;
      • 元数据锁(MDL);
      • 意向锁;
      • AUTO-INC 锁;

    2.1 表锁

    2.2 元数据锁(MDL)

    • 什么时候调用?
      • 我们不需要显示的使用 MDL,因为当我们对数据库表进行操作时,会自动给这个表加上 MDL
    • 什么时候释放?
      • 该事务提交之后,自动释放
    • 分类
      • 对一张表进行 CRUD 操作时,加的是 MDL读锁
      • 对一张表做结构变更操作的时候,加的是 MDL写锁
    • 目的
      • MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。
     
    • 读会阻塞原因?
      • 事务A长事务,读锁。
      • 事务A没结束,事务B写锁,B被阻塞。写锁优先级高于读锁,所以后续来的读事务都被阻塞。
      • 处理
        • 为了能安全的对表结构进行变更,在对表结构变更前,先要看看数据库中的长事务,是否有事务已经对表加上了 MDL 读锁,如果可以考虑 kill掉这个长事务,然后再做表结构的变更。
     
     

    2.3 意向锁

    意向锁是一种表级锁,用于表明一个事务打算在表中的某些行上施加共享锁或排他锁。这种锁的目的是在一个事务需要对表进行行级锁定时,自动在表级上施加相应的意向锁,以便其他事务在尝试对整个表施加表级锁时能够快速判断是否存在冲突[^1^][^2^]。意向锁分为意向共享锁(IS)和意向排他锁(IX)两种[^3^]。
     
     

    2.4 AUTO-INC 锁

    指的是 MySQL(主要是 InnoDB 存储引擎)里对 自增主键(AUTO_INCREMENT) 字段分配时使用的一种特殊锁。
    保证在并发插入时,自增列的值分配是连续且唯一的。
     

    3. 行锁

    InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。
    • 锁的分类
      • 共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。
        notion image
        eg

    3.1 Record Lock

    记录锁,也就是仅仅把一条记录锁上
    eg
     
     
     

    3.2 Gap Lock

    间隙锁,锁定一个范围,但是不包含记录本身
     
     

    3.3 Next-Key Lock

    Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身
     
     
     
     
     
    粗略了解MySQL事务MySQL如何存储数据?
    Loading...