mysql8事务级别_Mysql几种事务隔离级别

前言:之前对mysql的基础知识通过了几篇博客进行了一个详解,包括从数据库系统的原理以及最基本的操作使用,此篇博客将主要对mysql的事务级别进行实战分析

1.什么是事务?

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么全部失败

2.事务的基本要素

原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态。

一致性(Consistency):事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。

隔离性(Isolation):一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,对数据库中的数据的改变就应该是永久性,不能回滚。

3.事务出现的并发问题

脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

幻读:它发生在一个事务A读取了几行数据,接着另一个并发事务B插入了一些数据时。在随后的查询中,事务A就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读

4.事务的隔离级别

如上都是一些概念的东西,没有什么意思,还是需要通过实战来演示一下其中的原理以及奥秘,先放个图:

ac11ac120b88aca62d67d18057aa9548.png

mysql默认的事务隔离级别是rr,也就是可重复读级别(mysql8.0)

6642868c75238d73ab195369a25d5b2b.png

接下来通过操作数据库对各个事物隔离级别以及实现的原理进行介绍:

1.读未提交

(1)打开一个mysql客户端A,并设置当前事务模式为read uncommitted(未提交读),开启事务,查询user表的所有记录

- - >客户端A

dc7cfaecc4e9e115f6d867aeda45bd1a.png

(2)在客户端A的事务提交之前,打开另一个mysql客户端B,开启事务,更新表user

- - >客户端 B

8fff4f470fdd2b7658cfb2f9aa8e3a4b.png

(3)此时,客户端B的事务还没提交,但是客户端A就可查询到B已经更新的数据

- - >客户端A

2d5637cb05a557c56a64b57128307a29.png

(4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据

- - >客户端 B

3ab15167b08679161dab34e5c367bc4c.png

(5)在客户端A执行更新语句update user set age = age + 1where id =1,可以看到 lisa 的 age 没有变成100,而是18,导致数据不一致,这是因为在应用程序中,我们会用99+1=100,并不知道其他会话回滚,要想解决这个问题可以采用读已提交的隔离级别

- - >客户端A

ed5b0d78cb9691ab224b3a448d663552.png

2.读已提交

(1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),开启事务,查询表user的所有记录

- - >客户端A

030212a19575d7ceb8835477f3b8b641.png

(2)在客户端A的事务提交之前,打开另一个客户端B,开启事务,更新表user

- - >客户端 B

6ebbc4a656d811ea929554a124f85694.png

(3)此时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题

- - >客户端A

d370a11ed499211e3eb0f22c16e21772.png

(4)客户端B事务被提交

- - >客户端B

e12cecc3326031d4d5c29e51a41ee3a4.png

(5)客户端A执行与上一步相同的查询,结果 与上一步不一致,所以就产生了不可重复读的问题,要想解决这个问题可以采用可重复读的隔离级别

- - >客户端A

84f05a72a359aed43ab8682a346fa438.png

3.可重复读

(1)打开一个客户端A,并设置当前事务模式为repeatable read,开启事务,查询表user的所有记录

- - >客户端A

96638631d0c711a0e5b17065a3894eb9.png

(2)在客户端A的事务提交之前,打开另一个客户端B,开启事务,更新表user并提交

- - >客户端B

92bff16f79c295819bb84fa7e791aaad.png

(3)在客户端A查询表user的所有记录,与第一次查询结果一致,没有出现不可重复读的问题

- - >客户端A

c132ccfd9ccc2268ebc2956e08eea443.png

(4)在客户端A,接着执行update user set age = age + 1 where id = 1,发现age没有变成17+1=18,lisa的age值用的是步骤客户端B中的99来算的,所以是100,数据的一致没有被破坏。这是因为可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);而insert、update和delete会更新版本号,是当前读(当前版本)。

- - >客户端A

84136700d9905397242bd4892631c7ff.png

(5)重新打开客户端B,开启事务,插入一条新数据后提交

*- - >客户端 B *

a22064a2251ad3c708f9639cf3683d86.png

(6)在客户端A查询表user的所有记录,没有查出新增数据,但是却发现读的不是最新数据,这就是所谓的“幻读”

- - >客户端A

a7509d61f9b7aa503736b128a14ccc35.png

(7)在客户端A提交本次事务,再次读取数据,发现读取正常

- - >客户端A

dcebe7cb3faf95d114434e7fc6dc0821.png

4.串行化

(1)打开一个客户端A,并设置当前事务模式为可串行化(Serializable),开启事务,查询表user的所有记录

- - >客户端A

fbd15df01cd4c9b0573748b0fad3ea6d.png

(2)打开一个客户端B,并设置当前事务模式为可串行化(Serializable),开启事务,向user表中新添加一条数据

- - >客户端 B

184b5091b75b8632b10358511c6b8efe.png

(3)提交A客户端事务,然后发现B客户端插入数据成功

006e7fad0b6f05d41d38f005097ef187.png

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题

看这里↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

综上就是针对于mysql事务各种隔离级别的原理实现以及解决办法,在这里博主给各位游客出个mysql的面试题,你会吗?

问题:两个表结构完全相同,在不用not in的情况下根据name查出user表里有,但是user1表里没有的数据

以此题为例:查询结果是 gaowei,peter,jack 三条数据

69fb7678636c043f45ceb6c82984aca0.png

77649a1c2404366a0f0003a87487ec8f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制台应用和空项目有什么区别_互联网小程序的应用以及APP的应用有什么区别及发展...

随时移动互联网进入的千家万户,互联网的手机应用程序也渐渐的在市场上流行起来了。今天主要跟大家谈一下互联网小程序的应用以及APP的应用有什么区别以及未来的发展趋。未来会流行什么手机应用或者APP应用,我带大家都为了解一下。下边先来了解一下小程序…

day19_java基础加强_动态代理+注解+类加载器

一、动态代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一。        代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 …

使用循环链表实现一个通讯录的管理程序_【LeetCode链表题型总结】

点击上方蓝字,关注公众号链表概念的讲解链表是什么链表是一种线性数据结构,每个节点都存有数据,通过指针将各个节点链接在一起。链表的性质一致性: 每个节点有相同的数据结构,相同的数据大小,内存中占据相同的大小&…

python的kite下载安装及使用_Kite下载|Kite Python编程工具 V1.2020.1203.0 最新版下载 - 下载银行...

Kite是一款专为Python打造的一款代码补全软件,如果你正在学习Python或是从事与Python相关的编程工作,那么这款软件绝对是你的好帮手!其会智能判断用户想要输入的每个代码字段,并在所有库中进行匹配相应的内容,如果看到…

Linux 升级 Python 至 3.x

原文链接:http://blog.csdn.net/liang19890820/article/details/51079633 -------------------------------------------- 简述 CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对…

Sublime Text 3 配置python交互运行环境的快捷键

2019独角兽企业重金招聘Python工程师标准>>> 使用Sublime Text 3能以轻量级的环境写python脚本,运行python代码。为了更加方便地调用python脚本,通过在Sublime Text 3中绑定快捷键的方式,实现一键调用python交互运行环境&#xff…

xftp如何搜索文件_头条搜索站长平台如何添加网站和sitemap文件?附图文教程

头条搜索站长平台已经上线了,目前我们广大站长都可以登录该平台后添加新网站和提交 sitemap 地图文件,建议大家可以前往尝试一下,多一个搜索平台就多一条路,认为倒是挺好的。下面就跟大家简单介绍头条搜索站长平台如何添加网站和提…

彩铅练习,花船

图片发自简书App图片发自简书App

我的女朋友漏电了–论C++中的失败(failure),缺陷(bug)和异常(exception)

先做个广告置入,如果喜欢这篇文章,你可以到 zhaoyan.website/blog 去查看于此类似的C/C文章。 我承认有点标题党了,不过这真的是一篇写软件的文章,所以如果你已经抽出了一张面巾纸,那么趁早再把它完美的放回去。这篇软…

SQLplus 和mysql区别_mysql和oracle的区别有哪些

MySQL和Oracle都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用;大多数数据库以类似的方式工作,但MySQL和Oracle的这里和那里总是存在一些差异的。本篇文章就给大家比较Oracle和MySQL,介绍Oracle和MySQL之间的区别&#x…

127.0.0.1与localhost的区别

2019独角兽企业重金招聘Python工程师标准>>> 区别1: localhost也叫local ,正确的解释是:本地服务器 127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器) 他们的解析通过本机的host文件,windows自动将localhost解析为127.…

mysql 索引_MySQL之索引

索引查找算法BTREEBTREE查找算法演变B-TREE :普通 BTREE,平衡多路查找树(B-Tree)BTREE :叶子节点双向指针BTREE(B*TREE):枝节点的双向指针普通B-TREE增强版BTREE(B*TREE)总结:从上图看出,在BTree上有两个头…

java数学计算表达式_Java初学者:内建函数计算简单的数学表达式

这个应该在之前写的,忘记了,补上这次我们说一下如何用java计算数学表达式的值,比如,我们要计算sin(pi/3) cos(pi/6) 5.6^3,怎么计算呢?这里我们需要用到java的math的内建函数,所谓内建函数&am…

谷歌新作gVisor:VM容器融合技术已经到来

作者|秦承刚,吴启翾,喻望,杨伟 编辑|张婵 出处丨高效开发运维 5 月 2 日,谷歌发布了一款新型的沙箱容器运行时 gVisor,号称能够为容器提供更安全的隔离,同时比 VM 更轻量。容器基于共…

安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

​安卓开发之数据存储在本地的四种方式本地数据存储,在安卓开发过程中是不可避免的一个话题。这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据。基本上我们有4种方法可以存储安卓程序的数据。第1…

java vector 线程安全_关于Vector到底是不是 线程安全的 问题

线程安全,在java的多并发编程中是重要概念,意思是,多个线程同时操作一个对象,在各种不同情况下,都不会造成不同的后果。一个经典问题,Vector到底是不是线程安全的?很多人都会回答,是…

C# Winform使用Windows Media Player播放多媒体整理

一、简单使用示例步骤 1.添加Windows Media Player 组件当前是系统的 Com组件 工具箱》右键“选择项”》选择Com组件 2.控件拖拽到桌面,使用 private void button1_Click(object sender, EventArgs e) {//播放开始声音axWindowsMediaPlayer2.URL "start.mp3&q…

618选购手机正当时,好评率高达99%的手机了解一下!

一年一度的京东618年中购物狂欢节如火如荼的进行中,手机厂商们都使出了浑身解数,对消费者进行争夺。对于用户来说,618绝对是更换手机的好时机。不过,小伙伴们面对市场上的众多机型,也有可能挑花了眼,不知道…

IntelliJ IDEA 2017.2 x64 安装Scala

从官网下载好IntelliJ IDEA 和scala IntelliJ IDEA 安装scala插件 新建scala项目 建好后,发现src右键--新建---没有 .scala选项 解决方法

Django-ORM数据库操作

背景 Django框架功能齐全自带数据库操作功能,由于工作中设计巨量的api接口,需要一个很好的web后端服务框架,Django给了莫大的帮助。本文主要介绍Django的ORM框架我们一般对数据库的使用的认识是: 创建数据库,设计表结构…