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种常用的面向对象软件的设计模式之一。        代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 …

mysql压力写入测试_mysql压力测试工具

相关推荐:测试工具测试工具 测试管理工具 Quality Center 基于WEB的测试管理工具 Test Director 功能测试工具 QuickTest Professional 性能测试工具 LoadRunner 哪位仁兄有相关…

python中队列的应用用场景_消息队列应用场景

原文http://blog.csdn.net/konglongaa/article/details/52208273一、消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致…

oracle获取一段时间内所有的小时、天、月

原文链接:http://blog.csdn.net/ld422586546/article/details/9626921/ 点击阅读原文 ---------------------------------------------------------------------- 获取一段时间内所有的小时 SELECT to_date(2013-07-01 12, yyyy-mm-dd hh24) (ROWNUM - 1) / 24 s…

eclipse快捷键、智能提示

1、Alt / 调出智能提示功能,即使在XML文件中; 2、 转载于:https://www.cnblogs.com/JAVA-STUDYER/p/9143862.html

python下载网页歌词_python3个人学习笔记-批量下载分析歌词2

我发现之前自己真是太愚蠢了没有搞清楚正则表达的各种用法。不同词语的筛选根本不用像re.sub(另一个想替换的内容,另一个替换后的内容,re.sub(想要替换的内容,替换后的内容,x))这样傻了吧唧地筛一层又一层……(受linux的pipe荼毒太深)正则表达中不同字符的or其实大家都知道是[a…

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

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

win10 C盘超过50G?教你如何对C盘瘦身!

原文链接:http://blog.csdn.net/u012762305/article/details/53469446 点击阅读原文 ------------------------------------------- 本人C盘是128G SSD硬盘,Win10系统盘和一些常用的程序都装在这个盘(特大程序除外),…

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

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

layui前端时间戳转化

https://blog.csdn.net/rightbeforethesix/article/details/80358890转载于:https://www.cnblogs.com/newlangwen/p/9144204.html

单页web应用是什么?它又会给传统网站带来哪些好处?

原文链接:http://blog.csdn.net/zuoninger/article/details/38842823 点击阅读原文 ---------------------------------------------------- 什么是单页应用? 单页应用是指在浏览器中运行的应用,它们在使用期间不会重新加载页面。像所有的…

python图像等比例压缩_python使用pil进行图像处理(等比例压缩、裁剪)实例代码

PIL中设计的几个基本概念1.通道(bands):即使图像的波段数,RGB图像,灰度图像以RGB图像为例:>>>from PIL import Image>>>im Image.open(*.jpg) # 打开一张RGB图像>>>im_bands im.getbands() # 获取RG…

python的urllib四大模块_Python常用的内建模块4:urllib

urllib提供了一系列用于操作URL的功能Geturllib的request模块可以非常方便的抓取URL的内容, 也就是发送一个GET请求到制定的页面, 然后返回HTTP的响应:例如, 对豆瓣的一个URLhttps://api.douban.com/v2/book/2129650进行抓取, 并返回响应:from urllib import requestwith reque…

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 地图文件,建议大家可以前往尝试一下,多一个搜索平台就多一条路,认为倒是挺好的。下面就跟大家简单介绍头条搜索站长平台如何添加网站和提…

Angular4中常用管道

原文链接:http://blog.csdn.net/haijing1995/article/details/71404350 ----------------------------------------------------- Angular4中常用管道 通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一…

mysql死锁无法查询_MySQL死锁导致无法查询

客服反馈后台无法查询,原因大概知道,是因为MySQL的事务产生了死锁,以往都不知道是哪个事务锁住了,只能很粗暴地重启MySQL最近查找到一个方法,不用重启MySQL,记录如下登录到MySQL,来看下有哪些My…

彩铅练习,花船

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