Mysql 有哪些锁?
首先是全局锁 : 全局锁,这主要是做全局备份的时候使用的,在可重复读的情况下可以通过readandview 进行备份
然后是表级锁:
- 表锁对整张表进行加锁。
- 元数据锁(MDL)对表结构进行加锁,在进行CRUD操作时,需要获取MDL读锁,在进行表结构修改时需要获取MDL写锁。
- 意向锁,意向锁的目的是为了快速判断表里是否有记录被加锁。假如说表里面有意向锁,就说明有人要进行对于的读或者写的操作。(对应大楼门口的施工警示牌),它不会和行级锁发生冲突。
- AUTO-INC 锁,这个主键自增锁,每次插入记录时,都要获取这个表的AUTO_INC锁。AUTO-INC 锁是特殊的表锁机制,锁不是再一个事务提交后才释放,而是再执行完插入语句后就会立即释放。
行级锁:
- Record Lock 记录锁,也有 X锁跟S锁之分,锁的是索引
- Gap Lock 间隙锁,锁一个间隙,其他线程不可以对这个间隙范围机进行增删的操作。
- Next-Key Lock : 临间锁, 使用 Record Lock + Gap Lock ,锁定一个范围同时又锁定记录本身,
- 插入意向锁:配合 Gap Lock 使用,当要插入的位置上了Gap Lock 时,会阻塞。
MySQL 是怎样加锁的?
普通的 select 语句是不会对记录加锁的(除了串行化隔离级别),因为它属于快照读,是通过 MVCC(多版本并发控制)实现的。
如果要在select 语句进行加锁,可以使用 lock in share lock 或者 for update 进行锁定读,
update 和 deleted 都会加上行级的X锁。
加锁的对象是索引,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。
在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁。
Mysql死锁了怎么办?
死锁的原因:死锁的话是由于两个事务锁住了同一个范围,都要进行插入操作,都在等待对方释放锁。
如何避免死锁: 设置策略,超时回滚。死锁检查,自动回滚一条。
mysql怎么查看锁表的情况?
select * from performance_schema.data_locks\G;