- 按照粒度:行锁、表锁
- 按照级别:共享锁、排它锁
- 共享锁:事务A给一个数据加上了共享锁,事务B也只能给这条数据加上共享锁,都不能去加排他锁,并且都只能进行读操作,不能执行写操作。
- 排他锁:事务A给一条数据加上了排他锁,可以进行读和写操作。事务B既不能给这条数据加共享锁,也不能加排它锁,不能对这条数据进行任何操作。
- 按照使用方式:乐观锁、悲观锁
- 悲观锁:对一条记录修改前,会尝试加一个悲观锁,如果加锁成功,那么就去对该记录访问和操作。操作完成就会释放锁。如果在加锁的过程中有其他的操作给该条记录加排他锁,那么就会等待或者抛异常
- 乐观锁:乐观锁主要是通过version版本号的方式实现的,在对一条数据修改的同时,回去判断版本号和预期的版本号是否一致。
- 按照锁对象:间隙锁、记录锁、临键锁。
- 记录锁:锁的是索引记录,给一个索引节点加一把锁。即使没有创建索引,innodb也会创建一个隐式的主键索引。
- 间隙锁:间隙锁是在索引之间加一把锁。在查询的时候使用索引做范围查询如果没有命中任何一条记录,那么就是加的间隙锁。
- 临键锁:记录锁和间隙锁的组合。在查询的时候使用索引做范围查询,如果命中了记录,那么就是加的临键锁。
MySQL的锁机制——记录锁、间隙锁、临键锁_mysql间隙锁和临键锁各自的触发条件_路上阡陌的博客-优快云博客
- 意向锁:主要是为了解决行锁和表锁冲突。
- 如果事务A想要对某个行加行锁,那么先判断意向锁是否没有被其他事务获取,没有被其他事务获取那么事务A获取成功。然后再去获取行锁。
- 如果事务B此时想要去获取表锁,那么也去判断意向锁是否被其他事务获取,然后发现意向锁已经被获取,那么就等待意向锁的释放。