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)

大家都在看

  • Hbase中(java.io.IOException: Could not locate executable nullbinwinutils.exe in the Hadoop binarie)

    报错信息如下: 结合大神分析,应该为本机使用Hbase时,没有配置其环境变量。 出处:https://www.cnblogs.com/jessezeng/p/5520915.htm…

    数据库 2023年6月11日
    092
  • Redis-内存淘汰策略

    策略分类 内存写满了怎么办?Redis提供了以下几种内存淘汰的策略: No eviction 不淘汰数据 即,内存写满后,再有写请求时,Redis直接返回错误,不会提供服务。这也是…

    数据库 2023年6月11日
    088
  • centos7安装docker

    一、安装前必读 在安装 Docker 之前,先说一下配置,我这里是Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可。 注意:本文的命令使用的是 roo…

    数据库 2023年6月14日
    084
  • Git的使用

    1.前置篇 1.1 为什么要版本控制 1.2 什么是版本控制 1.3目前流行的版本控制软件有哪些 2.原理篇 2.1 GIT 概述 2.2 代码托管平台 2.3 GIT原理 3.安…

    数据库 2023年6月11日
    0105
  • centos8安装mysql

    前言 最近在centos8系统下部署django项目时,要用到mysql数据库,在安装中遇到了点坑,之后参考了一位博主的文章,也是顺利的安装配置成功,博主原文连接: ((20条消息…

    数据库 2023年5月24日
    086
  • mysql查询优化

    1.count优化 a语句当行数超过11行的时候需要扫描的行数比b语句要多, b语句扫描了6行,此种情况下,b语句比a语句更有效率。 当没有where语句的时候直接select c…

    数据库 2023年5月24日
    085
  • 2021 idea热部署

    依赖 org.springframework.boot spring-boot-devtools runtime true 导入 maven 插件 org.springframew…

    数据库 2023年6月14日
    0101
  • zabbix监控配置流程

    1.0 zabbix监控配置流程详细 管理角度: 开发 由开发人员提供监控指标来监控 运营 让其找开发要监控指标 运维 直接加 配置角度: 创建主机 创建主机组并加入主机 添加监控…

    数据库 2023年6月14日
    0100
  • 23种设计模式之状态模式(State)

    文章目录 概述 状态模式的优缺点 状态模式的使用场景 状态模式的结构和实现 * 模式结构 模式实现 总结 概述 当对象的状态改变时,同时改变其行为。 就拿QQ来说,有几种状态,在线…

    数据库 2023年6月6日
    0104
  • MySQL事务

    事务用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功后提交,要么全部失败。进行一个事物操作时,也可以防止其它用户修改表的数据。 举个例子:转账这个操作…

    数据库 2023年6月16日
    090
  • [Mysql]如何设置root密码(8.0+)

    在ubuntu上安装mysql时默认root账号是没有密码的,可以先用 mysql进入mysql,然后输入下面这个( mynewpassword改成要设置的密码): ALTER U…

    数据库 2023年6月16日
    081
  • PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open…

    数据库 2023年6月16日
    0135
  • SpringBoot下的文件上传

    ; 代码很简单。已经放到码云了,码云地址:https://gitee.com/zhang-zhixi/springboot-upload.git posted @2022-04-2…

    数据库 2023年6月14日
    081
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    数据库 2023年6月11日
    0104
  • Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制…

    数据库 2023年6月16日
    089
  • 【干货总结】:可能是史上最全的MySQL和PGSQL对比材料

    版权情况:PostgreSQL 11(免费开源)、MySQL5.7 Oracle官方社区版(免费开源)1. CPU限制 PGSQL 没有CPU核心数限制,有多少CPU核就用多少 M…

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