MySQL中锁的级别
页级:开销和加锁时间在表级锁和行级锁之间,会出现死锁
表级:开销小、加锁快,不会出现死锁;锁定颗粒度大,发生锁冲突概率最高,并发度最低
行级:开销大,加锁慢,会出现死锁;锁颗粒度最小,发生锁冲突概率最低,并发最高
MySQL中都有哪些锁?
共享锁和排他锁(独占锁)
share,S锁,称为共享锁,事务读取时获取,允许多个事务同时获取,不产生冲突
exclusive,X锁,称为独占锁,事务修改记录时获取,只允许一个事务获取X锁,其他事务阻塞等待
读锁和写锁(元数据锁)
读锁:多个事务同时持有不阻塞
写锁:独占访问数据
保证了元数据的一致性,防止了并发的DDL(修改表结构的语句altertable)和DML(增删改查)冲突
共享意向锁和独占意向锁(表锁)
都是表锁,用来标明当前表中是否存在S锁和X锁的,在上表级锁时,可以快速判断是否可以上锁,不需要遍历表中所有记录。
IS共享意向锁;IX独占意向锁
所以他们互相之间不会冲突,只是打个标记
间隙锁和临键锁(行锁)
间隙锁避免了幻读的产生
将两个索引值之间间隙中插入间隙锁,就可以阻塞其他插入操作,防止其他事务插入数据造成幻读
通过锁定行及其前面的间隙,防止幻读
插入意向锁
等待间隙锁的插入事务,建立插入意向锁,当间隙锁释放时对其进行唤醒
乐观锁和悲观锁
两种用于处理并发控制的机制
乐观锁认为每次执行都不会发生冲突,不用加锁,适合并发冲突少,读操作较多的场景,通过比较字段版本号(或时间戳),避免了加锁的开销
悲观锁认为每次都可能发生冲突,给任何可能发生冲突的地方加锁,适合并发冲突多,写多读少的场景,通过加锁的方式确保数据安全性,吞吐量较低
死锁是什么,发生死锁如何解决
死锁是指资源的循环依赖,发生在行锁;死锁是指两个或多个进程在执行过程中因争夺资源造成的一种僵局,当进程处于死锁状态时,他们将无法继续执行,只能互相等待,直到被外部干扰或自行放弃。
如何预防和避免:
1.避免资源独占
2.避免资源持有和等待
3.避免资源互斥