Mysql 锁 锁 锁

71 阅读3分钟
  • 全局锁 flush
    • 整个数据库将处于只读状态,除了(select)其他操作将阻塞
  • 表级锁
    • 表锁
    • 元素锁
    • 意向锁
    • AUTO-INC锁
  • 行级锁
    • 记录锁 Record Lock
    • 间隙锁 Gap Lock
    • 临键锁 Next-Key-Lock

上面涵盖了mysql的锁


全局锁

flush tables with read lock;
unlock tables;

全局锁应用场景一般为需要进行数据库逻辑备份,防止备份之后的的数据与备份前的数据不一致。(应用场景较少)。

如果当前会话开启全局锁模式,如果忘记解锁的情况,mysql会在会话断开的时候释放全局锁。

表级锁

表锁
  • 共享锁
lock tables table_name read;

只允许当前会话进行写(insert、update、delete等)操作,不影响其他会话要进行读(select)

  • 独占锁(排它锁)
lock tables table_name write;

只允许当前会话进行读写操作,其他会话的任何操作将会被阻塞。

  • 元素锁(MDL)

    • 是在表的元素上使用的锁;
    • 修改表名称、字段名、索引等等表结构操作的时候使用;
    • 作用:
      • 防止表结构并发修改,当一个事务修改表结构的时候,DML锁会确保其他事务不能同时修改同一张表的元数据
      • 取表表结构的一致性,确保事务读取到的表结构是稳定的,而不是在读取过程中中生表结构变化。
  • 意向锁

    • 意向锁主要是解决表锁行锁之间的兼容性问题。它是为了在行锁表锁共存的情况下,确保表的锁状态不会冲突。
    • 意向锁的目的是为了加快判断表里是否有记录被加锁。
    • S为共享锁
    • X为排他锁
    • XS、XX、SX 不兼容
    • SS兼容

当我们要给表加锁的时候,mysql需要知道是否已经有其他事务打算对表的某些行加锁。如果事务在表上加了行锁,那么表锁就应该阻止对表的修改操作。意向锁充当一个标记的作用,告知系统事务系统,打算对表的哪些行加锁,从而避免表锁和行锁的冲突。

  • AUTO-INC锁
    • 表里的主键通常都会设置成自增的,这是通过对主键字段生命AUTO_INCREMENT属性实现的。
    • AUTO-INC锁机制比较特殊,锁不是在一个事务提交后才释放,而是在执行完插入语句后就会立即释放。属于一种轻量级锁。

行级锁

记录锁 Record Lock
  • 锁住一条记录。而且记录锁有S锁和X锁。
    • 当一个事务对一条记录加了S型记录锁(意向共享锁),其他事务也可继续对当前记录加S型记录锁(意向共享锁),但是不可以对当前记录加X型记录锁(意向排他锁)。
    • 当一个事务对一条记录添加X型记录锁(意向排他锁),其他事务不可以对当前记录添加S型记录锁(意向共享锁)也不可以添加X型记录锁(意向排他锁)。XX、XS不兼容。
间隙锁 Gap Lock
  • 主要锁定某个范围内的间隙,防止其他事务插入符合条件的记录。避免幻读
临键锁 next-key-lock
  • 其实就是记录锁Record LockGap Lock 的结合。
  • 他既锁定行数据也锁定该行之前与之后的数据。
  • 也可以有效的防止幻读