目录
悲观锁和乐观锁
悲观锁
悲观锁由名字可知,就是把各种东西看的很消极悲观。比如在获取数据处理的时候,担心自己处理的过程中有人会修改这条数据,那么就把数据加锁(表锁、行锁等等)。那么这时其他线程操作数据就会处于阻塞状态,直到该线程操作完毕。
乐观锁
乐观锁就是在对数据库操作过程中,认为外界是不会对数据库操作造成冲突的。那么就不会对数据加任何形式的锁,而是在提交更新的时候,才会对数据进行冲突检测。乐观锁主要是采用了CAS的思想,之后会单独开一篇说这个以及ABBA问题。
MySQL中的锁
InnoDB存储引擎支持行锁和表锁,但其他像MyISAM、MEMORY等只支持表锁,所以以下针对于InnoDB引擎展开。
按锁的粒度分类
- 表锁,表级锁是对某个表执行DDL语句的同时其他事务执行DML语句会发生阻塞
- 行锁,行锁是面试中的重头戏。顾名思义就是在某行记录上加锁,行锁又主要有以下三种
Record Locks
对索引项加锁,锁定复合条件的行加锁
Gap Locks
对范围加锁,即索引项的间隙加锁。gap锁主要是用来解决幻读问题的,因为记录还不存在的时候是没有索引记录的,那固然是不能给索引加锁的。
Next-Key Locks
锁定索引项本身和索引范围,该锁其实是前两种锁的合体。它既能保护该条记录,又能阻止别的事务将新记录插入被保护记录前边的间隙
。
按锁是否可写分类
- 共享锁(读锁,简称S锁),在事务读取一条记录时,需要先获取该记录的S锁。假设事务T1获取到S锁后,其他事务比如T2也可以获取S锁,但无法获取X锁。
- 排它锁(写锁,简称X锁),在事务要变更记录的时候,需要先获取该记录的X锁。假设事务T1获取到X锁后,其他事务比如T2只能等T1提交事务释放后才能获取。