综述
对MySQL中并发控制所用到的机制和锁进行整理。
- 行锁
- 表锁
- 间隙锁
- 临键锁
- MVCC
- 悲观锁
- 乐观锁
行锁 Record Locks
顾名思义,是针对数据中已经存在的数据行上的锁。
- 也叫
记录锁
- 在
InnoDB
中,对索引列的操作会使用行锁,非索引列的操作会使用表锁(因为不在索引中,所以需要全表扫描) - 使用
<
、>
、!=
等符号进行范围内的查询时,会加上行锁和间隙锁
表锁 Table Locks
对整张数据表上的锁。
对效率影响较大
-
代码:
LOCK TABLES myTable WRITE; UNLOCK TABLES;
间隙锁 Gap Locks
主要用于封锁索引记录间的间隔。
- 产生条件:
- 对不存在的记录加锁
- 范围查询
临键锁 Next-key Locks
就是行锁和间隙锁的组合。
- 封锁范围:索引记录和索引区间
- 主要目的:避免幻读
多版本并发控制 MVCC
每个事务的读取操作所读取到的都是数据在某个时刻的快照。
- 用于解决读-写冲突
悲观锁
每次操作都假设为最坏的情况:其他事务会对本事务用到的数据进行操作。所以在事务开始时就直接对数据上锁。
- 在查询时就会锁上数据,直到数据被提交或者回滚
- 主要语法
FOR UPDATE
:select * from myTable for update; 其他操作…… commit;
乐观锁
每次操作都假设其他事务不会使用本事务的数据,所以只有在进行写操作的时候,才上锁。
- 通过类似“版本号”的机制来实现,读的时候确定版本,写的时候检查版本号:
update myTable set (……,version) values (……, version + 1) where version = 1;