- 全局锁 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 Lock 和 Gap Lock 的结合。
- 他既锁定行数据也锁定该行之前与之后的数据。
- 也可以有效的防止幻读