综述

对MySQL中并发控制所用到的机制和锁进行整理。

  • 行锁
  • 表锁
  • 间隙锁
  • 临键锁
  • MVCC
  • 悲观锁
  • 乐观锁

行锁 Record Locks

顾名思义,是针对数据中已经存在的数据行上的锁。

  • 也叫 记录锁
  • InnoDB中,对索引列的操作会使用行锁,非索引列的操作会使用表锁(因为不在索引中,所以需要全表扫描)
  • 使用<>!=等符号进行范围内的查询时,会加上行锁间隙锁

表锁 Table Locks

对整张数据表上的锁。

  • 对效率影响较大
  • 代码:
    LOCK TABLES myTable WRITE;
    UNLOCK TABLES;

间隙锁 Gap Locks

主要用于封锁索引记录间的间隔。

  • 产生条件:
    1. 对不存在的记录加锁
    2. 范围查询

临键锁 Next-key Locks

就是行锁间隙锁的组合。

  • 封锁范围:索引记录索引区间
  • 主要目的:避免幻读

多版本并发控制 MVCC

每个事务的读取操作所读取到的都是数据在某个时刻的快照。

  • 用于解决读-写冲突

悲观锁

每次操作都假设为最坏的情况:其他事务会对本事务用到的数据进行操作。所以在事务开始时就直接对数据上锁。

  • 在查询时就会锁上数据,直到数据被提交或者回滚
  • 主要语法FOR UPDATE
    select * from myTable for update;
    其他操作……
    commit;

乐观锁

每次操作都假设其他事务不会使用本事务的数据,所以只有在进行写操作的时候,才上锁。

  • 通过类似“版本号”的机制来实现,读的时候确定版本,写的时候检查版本号:
    update myTable 
    set (……,version) 
    values (……, version + 1) 
    where version = 1;