ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL事务之控制演进

2022-02-22 12:34:24  阅读:234  来源: 互联网

标签:事务 加锁 演进 记录 读写 MySQL 并发 MVCC


  在JMM之Java中锁概念的分类总结 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了锁的分类及相关内容,MySQL事务控制管理同样涉及这些锁。MySQL是如何通过锁进行事务控制的呢?

  下面介绍MySQL中的并发事务演进过程:

  1、不使用锁,排队处理事务

    是事务管理最简单的方法,就是完全顺序执行所有事务的数据库操作,不需要加锁,简单的说就是全局排队。序列化执行所有的事务单元,数据库某个时刻只处理一个事务操作,特点是强一致性,处理性能低。

        

   2、使用排他锁(独占锁)

    引入锁之后就可以支持并发处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。

        

    注意,在整个事务1结束之前,锁是不会被释放的,所以,事务2必须等到事务1结束之后开始。

   3、使用读写锁

    读和写操作:读读、写写、读写、写读。

    读写锁就是进一步细化锁的颗粒度(锁细化),区分读操作和写操作,让读和读之间不加锁,这样下面的两个事务就可以同时被执行了。

        

     读写锁,可以让读和读并行,而读和写、写和读、写和写这几种之间还是要加排他锁。

  4、MVCC
    多版本控制MVCC,也就是Copy on Write的思想。MVCC除了支持读和读并行,还支持读和写、写和读的并行,但为了保证一致性,写和写是无法并行的。
        

     在事务1开始写操作的时候会copy一个记录的副本,其他事务读操作会读取这个记录副本,因此不会影响其他事务对此记录的读取,实现写和读并行。

  MVCC(Multi Version Concurrency Control)被称为多版本控制,是指在数据库中为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。多版本控制很巧妙地将稀缺资源的独占互斥转换为并发,大大提高了数据库的吞吐量及读写性能。如何生成的多版本?每次事务修改操作之前,都会在Undo日志中记录修改之前的数据状态和事务号,该备份记录可以用于其他事务的读取,也可以进行必要时的数据回滚。

  那MVCC是如何实现的呢?

  MVCC最大的好处是读不加锁,读写不冲突。在读多写少的系统应用中,读写不冲突是非常重要的,极大的提升系统的并发性能,这也是为什么现阶段几乎所有的关系型数据库都支持 MVCC 的原因,不过目前MVCC只在 Read Commited 和 Repeatable Read 两种隔离级别下工作。

  在 MVCC 并发控制中,读操作可以分为两类: 快照读(Snapshot Read)与当前读 (Current Read)。

    1)快照读:读取的是记录的快照版本(有可能是历史版本),不用加锁。(select)

    2)当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加锁,保证其他事务不会再并发修改这条记录。(select... for update 或lock in share mode,insert/delete/update)

  假设 F1~F6 是表中字段的名字,1~6 是其对应的数据。后面三个隐含字段分别对应该行的隐含ID、事务号和回滚指针,如下图所示:
        

   具体的更新过程如下:

    假如一条数据是刚 INSERT 的,DB_ROW_ID 为 1,其他两个字段为空。当事务 1 更改该行的数据值时,会进行如下操作:

        

      1)用排他锁锁定该行;记录 Redo log;

      2)把该行修改前的值复制到 Undo log,即图中下面的行;

      3)修改当前行的值,填写事务编号,使回滚指针指向 Undo log 中修改前的行。

    接下来事务2操作,过程与事务 1 相同,此时 Undo log 中会有两行记录,并且通过回滚指针连在一起,通过当前记录的回滚指针回溯到该行创建时的初始内容,如下图所示:

        

  MVCC已经实现了读读、读写、写读并发处理,如果想进一步解决写写冲突,可以采用乐观锁和悲观锁两种方案。

  

标签:事务,加锁,演进,记录,读写,MySQL,并发,MVCC
来源: https://www.cnblogs.com/ilovebath/p/15893664.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有