MYSQL事务篇(高级篇)

1.事务介绍:

  • 一般是指要做的或所做的事情。 在计算机 术语 中是指访问并可能更新数据库中各种 数据项 的一个程序 执行单元 (unit)

2.数据库事务具有ACID四大特性

  • ACID是以下4个词的缩写:
  • 原子性(atomicity) :事务最小工作单元,要么全成功,要么全失败 。
  • 一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏 。
  • 隔离性(isolation) :不同事务之间互不影响,四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。
  • 持久性(durability) :事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失 。

3.隔离级别:

  • 四种隔离级别分别为:

1) 未提交读(READ UNCOMMITTED/RU) 如果一个事务读到了另一个未提交事务修改过的数据,那么这种 隔离级别 就称之为 未提交读 会产生脏读的情况

2) 已提交读(READ COMMITTED/RC) 不可重复读:一个事务因读取到另一个事务已提交的update。导致对同一条记录读取两次以上的结果不一致。

如果一个事务只能读取由另一个提交的事务修改的数据,并且每次数据被另一个事务修改和提交时,该事务可以查询最新的值,那么这个隔离级别称为提交读取,这可能导致幻影读取。

[En]

If one transaction can only read the data modified by another committed transaction, and every time the data is modified and committed by another transaction, the transaction can query for the latest value, then this isolation level is called committed read, which can lead to phantom reading.

3) 可重复读(REPEATABLE READ/RR) 在一些业务场景中,一个事务只能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,

即使另一个事务修改了记录的值并提交,当在事务之后读取记录时,仍会第一次读取值,而不是每次都读取不同的数据。然后,这种隔离级别称为可重复读取,这将导致幻影读取。

[En]

Even if another transaction modifies the value of the record and commits, when the record is read after the transaction, the value is still read for the first time, rather than different data each time. Then this isolation level is called repeatable reading, which will lead to phantom reading.

4) 串行化(SERIALIZABLE) 最高的默认级别,强制事务串行执行(即一个事务一个事务执行)。效率极其低下。

幻读:一个事务因读取到另一个事务已提交的insert数据或者delete数据。导致对同一张表读取两次以上的结果不一致。

不可重复读: 一个事务因读取到另一个事务已提交的update。导致对同一条记录读取两次以上的结果不一致。

4.讲讲事务和MVCC 底层原理详解:

比如现在有一个例子:

一个转账的一个案例:

丢失更新

当两个事务修改相同数据的操作时,会出现丢失更新的问题。

[En]

When two transactions modify operations for the same data, there will be the problem of missing updates.

4.1解决方案:LBCC :

使用LBCC (LBCC ,基于锁的并发控制,英文全称Lock Based Concurrency Control )可以解决上述的

问题。查询总额事务会对读取的行加锁,等到操作结束后再释放所有行上的锁。因为用户A 的存款被 锁,导致转账操作被阻塞,直到查询总额事务提交并将所有锁都释放。

示例:这种方案比较简单粗暴,就是一个事务去读取一条数据的时候,就上锁,不允许其他事务来操作

4.2:解决方案2:MVVC:

MVCC (MVCC,多版本的并发控制,英文全称:Multi Version Concurrency Control )机制可

以解决这个问题。查询总额事务先读取了用户A 的账户存款,然后转账事务会修改用户A 和用户B 账户存

款,查询总额事务读取用户B 存款时不会读取转账事务修改后的数据,而是读取本事务开始时的数据副本(在REPEATABLE READ 隔离等级下)

只支持RC,RR隔离级别

示例:MVCC 使得数据库读不会对数据加锁,普通的SELECT 请求不会加锁,提高了数据库的并发处理能力

5.Mysql 的MVCC 实现(重点):

  • MVCC是用于数据库提供并发访问控制的并发控制技术MVCC最大的好处:相信也是耳熟能详:读不加锁,读写不冲突。
  • 多版本并发控制只是一个技术概念,没有统一的实施标准
    [En]

    Multi-version concurrency control is only a technical concept and there is no unified implementation standard*

  • 其核心理念是数据快照。不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。
    [En]

    its core idea is data snapshots. Different transactions access different versions of data snapshots, thus achieving different transaction isolation levels.*

5.1MVVC的实现机制:

mvvc是通过undo log+readview实现的:

undo log :

  • 回档日志是提交一些未提交操作的原始状态,然后记录版本号:
    [En]

    A rollback log is to submit the original status of some uncommitted operations, and then it will record the version number:*

  • 如果有主键是2个隐藏列 如果没有则是3个隐藏列
  • 隐藏栏目由三部分组成。
    [En]

    Hidden columns are composed of three parts.*

    1. rowid:如果没有主键则会自动生产
    1. 回滚指针:指向记录的上一个版本号
    1. 事务id:记录了操作这条事务的id(这个id是唯一的而且是自增的) 然后每次更新都会有生产一个新版本通过回滚指针指向旧版本 形成一个版本链
  • 执行删除操作的时候是不会直接删除的是进行了一个打了一个删除标记,真正删除是通过purge线程执行清除操作的

ReadView:

  • 相当于一个快照,只要readview不改变则读取的结果就是一样的
  • readview生产时刻就是执行select操作时生产的一个select对应一个ReadView select执行完毕那么ReadView就会失效
  • 它就是一个数组(m_ids) 记录了当前时刻数据库活跃的事务id列表,它的可见性判断呢可以根据m_ids与事务id进行判断 判断条件可以根据(如果都可读以最新版本为准):

MYSQL事务篇(高级篇)

句个列子比如:

MYSQL事务篇(高级篇)

如果数据库没有活跃的事务,那么ReadView(m_ids)中包含的就是将要生成的事务id。

在REPEATABLE READ(RR)隔离级别下,MVCC 具体是如何操作的。

1.SELECT

InnoDB 会根据以下两个条件检查每行记录:

  1. InnoDB 只查找版本早于当前事务版本的数据行(也就是,行的事务编号小于或等于当前事务的事务编号)

这确保事务读取的行要么在事务开始之前就存在,要么由事务本身插入或修改。

[En]

This ensures that the rows read by the transaction either exist before the transaction starts, or are inserted or modified by the transaction itself.

2.删除的行要事务ID 判断,读取到事务开始之前状态的版本。

只有满足上述两个条件的记录才能作为查询结果返回。

[En]

Only records that meet the above two conditions can be returned as query results.

2.INSERT

InnoDB 为新插入的每一行保存当前事务编号作为行版本号。

3.DELETE

InnoDB 为删除的每一行保存当前事务编号作为行删除标识。

4.UPDATE

InnoDB 为插入一行新记录,保存当前事务编号作为行版本号,同时保存当前事务编号到原来的行作为行删除标识。

MVCC是如何解决隔离级别的呢?

RC事务隔离级别的实现:

读已提交:当前事务可以读取其他事务提交的结果

实现方案:当前事务执行select语句时会生产一个ReadView,如果再次执行这个selct语句继续生成ReadView。

RR事务隔离级别的实现:

可重复读:当前事务中执行的select语句的多次执行结果都是相同的,不管其他事务有没有提交。

实现方案:在当前事务执行select语句生产一个ReadView,之后同一个select使用同一个ReadView

RC和RR的区别:

  • READ COMMITTD 、REPEATABLE READ 这两个隔离级别的一个很大不同就是生成ReadView 的时机不同
  • READ COMMITTD 在每一次进行普通SELECT 操作前都会生成一个ReadView
  • 而REPEATABLE READ 只在第一次进行普通SELECT 操作前生成一个ReadView ,之后的查询操作都重复这个ReadView 就好了。
  • 在REPEATABLE READ 隔离级别下,MVCC 具体是如何操作的。

Original: https://www.cnblogs.com/yunjie0930/p/15559065.html
Author: 小杰i
Title: MYSQL事务篇(高级篇)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508040/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL备份迁移之mydumper

    简介 mydumper 是一款开源的 MySQL 逻辑备份工具,主要由 C 语言编写。与 MySQL 自带的 mysqldump 类似,但是 mydumper 更快更高效。mydu…

    数据库 2023年5月24日
    0111
  • 从学校到公司,2022新的起点!!!

    步入新的阶段 目前仍然是大学生的身份,但也算是打工人了。2021秋招时来到了天津的一个公司做实习生,并签订了三方协议。已经来公司将近一个月了,我在这段时间想了很多关于我的未来发展方…

    数据库 2023年6月6日
    066
  • MySQL的FIND_IN_SET函数

    语法:FIND_IN_SET(str,strlist) https://www.cnblogs.com/xiaoxi/p/5889486.html Original: https:…

    数据库 2023年6月16日
    051
  • null和空字符串对于查询where条件语句的影响

    在数据库中我们进行数据处理的过程中,对于null值或者空字符串的情况对于这种数据我们进行计算平均值以及查询过程中如何进行对于这类数据的处理呢? step1:建表:create ta…

    数据库 2023年6月6日
    087
  • MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log、redo log和undo log 今人不见古时月,今月曾经照古人。 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息…

    数据库 2023年6月14日
    074
  • 创建镜像(alpine版)+alpine

    podman用脚本和dockerfile做apache编译安装镜像 1.0安装介质 2.0 特点 2.0 基础命令 3.0 模式 podman用脚本和dockerfile做apac…

    数据库 2023年6月14日
    084
  • servlet映射路径匹配解析

    开头 servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的 假设有一个reques…

    数据库 2023年6月16日
    081
  • 关于互联网通信流程–架构–资源文件等

    互联网通信流程: 客户端 ——–服务端 互联网通&amp…

    数据库 2023年6月11日
    077
  • Shell第三章《for循环》

    语法结构: for 变量名 [ in 取值列&a…

    数据库 2023年6月14日
    083
  • 6、发送验证码功能(Redis)

    一、业务需求: 1、后端随机生成短信验证码,并在服务器端保存一定时间(redis); 2、将短信验证码发给用户; 3、用户输入短信验证码提交后,在后端与之前生成的短信验证码作比较,…

    数据库 2023年6月6日
    076
  • day03-2无异常退出

    多用户即时通讯系统03 4.编码实现02 4.3功能实现-无异常退出系统 4.3.1思路分析 上述代码运行时,在客户端选择退出系统的时候,可以发现程序并没有停止运行,原因是: 退出…

    数据库 2023年6月11日
    073
  • HTML5基础知识

    作者导言: 引用偶像刘德华的一句话 “学到的就要教人,赚到的就要给人”! 以下是关联的web前端基础知识文章,通过这些文章,您既可以系统地学习和了解这些知识…

    数据库 2023年6月14日
    049
  • B树详解

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 什么是B树 B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。使用B树这种数据结构…

    数据库 2023年6月14日
    090
  • 简单日期格式化的使用

    简单日期格式化的应用 简单日期格式化的使用 面试题: 有一个时间 20…

    数据库 2023年6月16日
    064
  • ElasticSearch详解

    什么是ElasticSearch ElasticSearch是一款非常强大的、基于Lucene的开源搜素及分析引擎;它是一个实时的分布式搜索分析引擎。它通常被用作全文检索、结构化搜…

    数据库 2023年6月6日
    089
  • 希望腿上的伤快点好

    明天去星巴克泡一会儿想把一些课程关联到的课程学习一下 Original: https://www.cnblogs.com/ukzq/p/16747859.htmlAuthor: D…

    数据库 2023年6月11日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球