MySQL中的锁和并发控制

综述

对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;
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容