首页 > 数据库 >mysql之事务隔离级别以及MVCC

mysql之事务隔离级别以及MVCC

时间:2022-10-07 17:55:46浏览次数:44  
标签:回滚 快照 隔离 mysql 事务 线程 MVCC

  1.事务特性:ACID

    原子性:undolog--要么全部成功,要么全部失败

     一致性:最核心和最本质的要求

    隔离性:MVCC(多版本并发控制)

    持久性:redo log

   

 

  2.事务的隔离级别

    事务的隔离级别有四种:读未提交、读已提交、可重复读、序列化

    脏读:事务B读取到了事务A已修改但尚未提交的数据,还在这个数据基础上做了操作,此时,如果A事务回滚,B读取的数据无效,不符合一致性要求。

    不可重复读:一个事务范围内两个相同的查询却返回了不同的数据 -----针对修改

    幻读:事务A读取到了事务B的新增数据,不符合隔离性-------针对新增和删除

   3.隔离性引出MVCC

    MVCC:多版本并发控制、是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。 

    数据库并发场景:

      1.读读:不存在任何问题

      2.读写:有线程安全问题、可能出现脏读、幻读、不可重复读

      3.写写:有线程安全问题,可能存在更新丢失等。

     MVCC解决的就是读写时的线程安全问题,线程不用去争抢读写锁。       Mysql两种读方式:

      当前读:读取的是数据的最新版本,而且要保证其他并发事务不能修改当前记录,场景:lock in share mode,for update,updatedelete,insert

      快照都:不加锁的非阻塞读,读取的是历史版本的数据,不是最新的记录,场景:不加锁的select 

    MVCC:multi-Version concurrency control:多版本并发控制,用来解决并发读写的问题,不需要通过加锁来解决 。

  

  MVCC不同事务隔离级别的不同表现:

    RC隔离级别下:当其他事务修改数据之后,可以看到修改之后的值

    RR隔离级别下:当其他事务修改数据之后,看不到修改之后的值 

  MVCC实现原理:

    MVCC模块在Mysql中的具体实现是由三个隐式字段、undo日志、read view三个组件来完成

    三个隐藏字段:

      DB_TRX_ID:6字节,最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id

      DB_TOLL_PTR:7字节,回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个旧版本

      DB_ROW_ID:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动创建一个row_Id                   undo log: 

 

    undolog被称之为回滚日志,表示在进行insert,delete,update操作的时候产生的方便回滚的日志。

    当进行insert操作的时候,产生的undolog只在事务回滚的时候需要,并且在事务提交之后可以被立刻丢弃。

    当进行update和delete操作的时候,产生的undolog不仅仅在事务回滚的时候需要,在快照读的时候也需要,所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(当数据发生更新和删除操作的时候都只是设置一下老记录的deleted_bit,并不是真正的将过时的记录删除,因为为了节省磁盘空间,innodb有专门的purge线程来清除deleted_bit为true的记录,如果某个记录的deleted_id为true,并且DB_TRX_ID相对于purge线程的read view可见,那么这条记录一定时可以被清除的)。

      readview:最大作用用来做可见性判断 

  案例展示1: 

  案例展示2: 

    说明第二次select并没有生成新的readview,而是沿用了第一次快照时刻的readview。 

  RR隔离级别能否解决幻读问题?

  不能,产生幻读的本质原因

  如果事务中都是用快照读,那么是不会产生幻读问题的,但是当快照读和当前读一起使用的时候就产生了幻读问题 

标签:回滚,快照,隔离,mysql,事务,线程,MVCC
From: https://www.cnblogs.com/qiulong/p/16760162.html

相关文章

  • MySQL用户也可以是个角色
    前言角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle、SQLServer、OceanBase等,MySQL自从8.0release才引入角色这个概念。为用户赋予统一的角......
  • mysql8.0创建用户并给用户授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户:createuser'username'@'host'identifiedby'password'......
  • MySQL相关-内置表、版本信息
     内置数据库、表内置表查看表信息(所有数据库的表)select*frominformation_schema.TABLES 查看列信息(所有表的列表)select*frominformation_schema.COLU......
  • mysql sql语句
    基本sql语句不区分大小写,关键字尽量大写。ddl数据库操作showdabebases;查询所有数据库selectdababase();创建数据库系统creatdatabase[ifnotexists]数据库名[d......
  • MySQL库,表,数据的操作
    数据库的操作1.创建数据库createdatabase[ifnotexists]`数据库名`charset=字符编码(utf8mb4);如果多次创建会报错如果不指定字符编码,默认为utf8mb4(一个汉......
  • 安装Mysql之Playbook
    ----name:installmysqlhosts:allvars:mysql:mysql-8.0.28-linux-glibc2.12-x86_64tasks:-name:installpackageyum:name:-l......
  • MySQL面试题(三)
    27、索引的底层实现原理和优化B+树, 经过优化的B+树主 要是在所有的叶子结点中增加了指向下一个叶子节点的指针,  因此InnoDB建 议 为大部分表使用默认自增的主键作为......
  • python+request+pymysql+pytest数据驱动
    一.pymysql简单使用1.安装mysql下载地址:https://www.mysql.com/,安装教程这里不做介绍了,网上一大推。2.安装pymysql库在Terminal终端输入:pipinstallpymysql3.pymysql......
  • MySQL基础--事务--2022年10月7日
    第一节  事务简介1、什么是事务2、注意:默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MaSQL会立即隐式的提交事务。第二节  事务......
  • MySQL--多表查询--2022年9月30日
    第一节  多表关系1、一对多2、多对多3、一对一第二节  多表查询概述1、笛卡尔积:select*fromA,B;......