1、共享排他锁 Shared and Exclusive Locks
--共享锁(SLock),允许持有该锁的事务读取一行数据
--排它锁(XLock),允许持有该锁的事务删除或者更新一行数据
特性:
--行级锁
--如果一个事务持有当前行的共享锁,那么其他事务就可以获得该行的共享锁
--如果一个事务持有当前行的排他锁,那么其事务必须等待这个事务释放后才能持有
加共享锁
--Update、Delete语句 在 innoDB会自动给设计的数据集加上排它锁
--普通Select语句是不会加任何锁
--MySQL 8.0之前的写法 但是不支持NOWAIT\SKIP\LOCAKED等特性
select * from xx where id = xx LOCK IN SHARE MODE;
--MySQL8.0开始支持
select * from xx where id = xx FOR SHARE;
加排它锁
--FOR Update
select * from xx where id = xx FOR UPDATE
2、意向锁(Intention Locks)
--未来的某一时刻,事务需要加共享排它锁,所以提前声明意向
--意向共享锁(intention shared lock,简称IS):表示事务有意向对表中的某些行加共享锁
--意向排他锁(intention exclusive lock,简称IX):表示事务有意向对表中的某些行加排他锁
特性:
--表级锁
--事务在请求S锁和X锁前,需要先获得对应的IS、IX锁
--意向锁不会阻塞全表扫描以前的任何请求
3、记录锁(Record Locks)
--用来封锁索引记录,从而防止其他的事务针对同一条记录执行增删改操作
4、间隙锁(Gap Locks)
--在Repeatable-Read(可重复读)隔离级别下的锁机制,用来封锁索引里面的间隙,解决幻读问题
--间隙:键值在条件范围内但不存在的记录
--包括:索引记录之间的间隙,第一条索引记录之前的范围,最后一条索引记录之后的范围
特性:
--要有索引
--封锁的是索引里面的间隙,防止其他事务在间隙中插入数据
--解决幻读问题
5、临键锁(Next-Key Locks)
--记录锁和间隙锁的组合,封锁索引记录和索引中的间隙
--会封锁记录本身已经索引记录之前的区间,即范围(上一条记录,记录本身)
--如果一个事务占用了索引记录R的共享排它锁,则其他事务不能在记录R及之前的区间插入新的索引记录
--InnoDB行锁默认用的就是临键锁
6、插入意向锁(Insert Intention Locks)
--由insert操作在插入行之前设置的一种间隙锁
--多个事务,在同一个索引,同一个范围区检察露记录时候,如果插入的位置不冲突,就不会阻塞彼此
7、自增锁(AUTO-INC Locks)
--特殊的表级锁
--专门针对插入AUTO_INCREMENT类型的列的事务
--最简单情况,如果一个事务正在往表里中插入记录,其他事务的插入必须等待,一边第一个事务插入的行的值是连续性的
--innodb_autoinc_lock_mode 可以用来调整锁的算法
8、谓词锁(Predicate Locks)
--用于空间索引的锁