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)

大家都在看

  • 关于接口设计的思考–我们真的需要这么多入参吗

    最近,我改造一个旧接口时发现,这个接口有 30 多个入参,而事实上并不需要那么多,而且,这个接口还存在比较大的安全隐患。所以,关于如何设计接口入参,我想谈谈自己的一些想法。 当然,…

    数据库 2023年6月6日
    080
  • docker 单机部署redis集群

    docker 部署redis集群 1、创建redis网卡 docker network create redis –subnet 172.38.0.0/16 查看网卡信息 doc…

    数据库 2023年6月11日
    087
  • dubbo 使用Multicast注册中心找不到Provider (No provider available for the service)

    使用Multicast注册中心配置,缺省配置为通过Multicast注册中心广播互相发现。所以在同一台机器时需设置unicast=false:即:multicast://224.5…

    数据库 2023年6月16日
    093
  • Java中,那些关于String和字符串常量池你不得不知道的东西

    老套的笔试题 在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true。 String s1 = new Strin…

    数据库 2023年6月16日
    096
  • MySQL第1章——数据库概述

    数据库概述 为什么要使用数据库 什么是数据持久化? 数据持久化就是把数据保存到可掉电式存储设备中供以后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘…

    数据库 2023年6月14日
    081
  • django-nginx与uwsgi项目部署

    uwsgi是提供动态服务的 nginx反向代理 在项目中创建一个settings.py的副本。我这里重命名为copy_settings.py,将配置文件中的DEBUG=False …

    数据库 2023年6月6日
    0104
  • 2018年最新JAVA面试题总结之基础(1)

    转自于:https://zhuanlan.zhihu.com/p/39322967 1、JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗?…

    数据库 2023年6月16日
    094
  • Linux–>shell

    shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。 用户可以用Shell来启动,挂起,停止,编写一些程序。 S…

    数据库 2023年6月14日
    0109
  • MySQL事务、隔离级别

    一、事务简介 事务是操作的集合,它是一个不可分割的工作单元。事务将向整个系统提交或取消操作请求,即这些操作要么同时成功,要么同时失败。 [En] A transaction is …

    数据库 2023年5月24日
    082
  • yum安装Mysql8.0

    停止MySQL service mysqld status service mysqld stop 卸载已经安装过的MySQL 检查是否已经安装 rpm -qa|grep mysq…

    数据库 2023年6月9日
    074
  • LeetCode 26. 删除有序数组中的重复项

    给你一个 升序排列 的数组nums,请你 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 由于在某些语言中不能改变数组的长度,…

    数据库 2023年6月11日
    087
  • Linux巡检脚本

    #!/bin/bash sys:centos6.x/7.x [ $(id -u) -ne 0 ] && echo "请&#x…

    数据库 2023年6月14日
    0112
  • 享受时间 拥抱 Linux

    生活上小闲心 用 游戏 影音 音乐 可以尝试 Window or Macos. 初期代码生涯推荐全面拥抱 Linux , 耐下心少学点, 多享受光 邵雍· 《清夜吟》 月到天心处,…

    数据库 2023年6月9日
    087
  • Spring5完整版详解

    1、Spring 1.1简介 2002,首次退出来Spring框架的雏形:interface21框架 Spring框架即以interface21框架为基础,经过重新设计,并不断丰富…

    数据库 2023年6月16日
    086
  • Java开源博客系统AngelBlog发布

    一、Java开源博客系统(AngelBlog)系统简介 Angel工作室AngelBlog系统是基于Java Spring boot +前端bootstrap+jquery+lay…

    数据库 2023年6月14日
    079
  • Javaweb-JSP详解

    一、什么是JSP Java Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术 最大的特点: 写JSP就像在写HTML 区别: HTML只给用…

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