1.读写锁
互斥锁(Exclusive),简写为X锁,又称为写锁。
共享锁(Shared),简写为S锁,又称为读锁。
对X锁和S锁有两个规定:
①一个事务对数据对象A加了X锁,那么就可以对A进行读取和更新。加锁期间其他事务不能对A加任何形式的锁。
②一个事务对数据对象A加了S锁,可以对A进行读取操作,但是不能进行更新操作。加锁期间其他事务能对A加S锁,但是不能加X锁。
2.意向锁
意向锁在X/S锁的基础上引入了IX/IS锁。意向锁是一种表级锁,但是它是一种不与行级锁冲突的表级锁。加意向锁不会影响加行级锁,它只会阻塞表级锁。使用意向锁(Intention Locks)可以支持多粒度封锁(同时存在表级锁和行级锁)。
意向锁主要解决在表级锁和行级锁同时存在时,加表级锁需要检测表级锁和每一行的行级锁时效率低下的问题。比如在同时存在表级锁和行级锁的时候,如果一个事务想要对表A加X锁(表级锁),就要检测表A以及表A的任一行是否加了锁,这样检测十分耗时。
意向锁的主要作用是:如果有一个事务在表上加了锁,其他事务想要在该表级别上应用X锁或S锁,就会受到第一个事务的意向锁的阻塞。其他事务在锁定该表之前不需要检测表或者表的每一行是否加了锁,而只需要检测表的意向锁。
意向锁是数据引擎(InnoDB)自己维护的,用户不能手动修改意向锁。一个事务在表的某一行加X锁或S锁之前,数据引擎会先获取该数据行所在数据表的相应IX或IS锁。
所有的意向锁之间是兼容的。意向锁也不会与行级的S/X锁互斥。
意向锁不会影响多个事务对表的不同行加互斥锁,但用普通的表锁会。
意向锁只是为了用来阻塞表级锁,意向锁和表级读写锁之间的兼容关系如下表:
意向互斥锁 | 意向共享锁 | |
表级互斥锁 | 冲突 | 冲突 |
表级共享锁 | 冲突 | 兼容 |