0


Mysql的事务是什么?什么是脏读,什么是幻读?不可重复读?

提示:虽然事务在实际工作中的作用不是很大,但在校招笔试,面试中是数据库的重点考试题目!!!所以宝子们要打起十二分精神阅读本篇文章!!!

前言:

Mysql关系型数据库是默认开启事务的,本篇文章将使用MySQL数据库和Navicat为大家讲解事务。本文将详细介绍什么是事务,事务的四大特征,事务的隔离级别,那就让我们开始今天的学习吧!

一、什么是事务

我们首先来看看官方对于事务的定义:

事务,就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQl都将被取消执行。

注意:MySQL数据库中仅仅innoDB和BDB类型的数据库表支持事务!


如果没有理解官方概念,不要慌!让我们一起来看看下面这个例子:

话说五百年前的m78星云有个叫佐菲的虽然是宇宙警备队队长,但他一出场总挨揍,于是想买身盔甲让自己更加仁兄抗揍些,所以然就去了地球找到了某迦买战甲。。。

仁兄,你这泡泡龙战衣服看着不错,给我来十沓。

                                                    可以啊!老哥有眼光,这就给你打包好!![](https://img-blog.csdnimg.cn/cffd69191d3d4ea9b41f86f75ce2d703.jpeg)!!

但是佐菲老穷了,拿着战甲就想跑w(゚Д゚)w

那我们想想,佐菲拿衣服不交钱这行不行啊!这显然是不行的!

于是迪迦说:"必须一手交钱一手交货,这才算是一个完整的交易!"

事务的体现:交钱和交货必须全部完成,事务才算成功,任何一个活动失败,整个事务就失败了!

** 我们再来看看两个对于事务的理解:**

理解一:

事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。

理解二:

事务可以看做是一个大的操作,它由一系列操作组成,这些操作要么全部成功,要么全部失败。

二、事务的隔离级别

1、原子性(Atomicity)

是指事务包含的所有操作要么全部成功,要么全部失败,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

我们再来想想,佐菲虽然没有大钱,但他还是有那么点私房钱的,于是给迪迦说,能不能分期付款,但迪迦却说,大哥啊,小老弟我这也是小本买卖,必须一次付清,概不赊账!!!

事务体现:原子性就是不可在分割,钱就不能分期付。

2、一致性(Consistency)

是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

佐菲实在没办法,只能找他的三弟赛文借钱,佐菲说:“你看大哥借你91还你1块行不,去个零头”

赛文听了顿时大吃一惊:“虽然你是我好大个,但也不能这样欺负你小老弟啊,必须借多少还多少!!!”
事务体现:在一次借钱过程中,借多少必须与之后还多少保持一致。

3、隔离性(Isolation)

是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

问赛文借完,佐菲突然感觉自己暴富了,于是想买更好的战甲,但钱又有些不太够,于是又问他的二弟初代借钱:“二弟啊!你看大哥最近手头有些紧,要不你借大哥点money,到时候大关还三弟钱就当给二弟你还钱了”

初代一听,顿时不知所措:“大哥啊!三弟是三弟,你问我俩借的钱互不相干啊!该还钱还得还!!!”

事务体现:佐菲向赛文和初代借的钱有关系没,显然是没有关系的,并且向初代借钱或者还钱不影响向赛文借钱还钱。这个过程是不受其他部分影响的。

4、持久性(Durability)

是指一个事务一旦被提交,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

佐菲终于拿着钱买到了心心念念的战甲,于是迫不及待的去找小怪兽单挑,结果一出场虽然打出了十八般武艺,但怎料战甲还是被一掌击碎,这时候就算佐菲在伤心,战甲已然碎裂,无法复原。

事务体现:事务一旦提交,对数据库数据改变是永久性的!!!

三、实现事务的方法和步骤

四、事务的隔离级别

Read Uncommited,读未提交:

即一个事务可以读取另一个未提交事务的数据;并发操作会导致脏读

Read Commited,读操作:

即一个事务要等到另一个事务提交后才能读取数据;解决脏读问题;并发操作会导致不可重复读

Repeatable Read,重复读:

即开始读取数据(事务开启)时,不再允许修改操作;解决不可重复读问题;并发操作会导致幻读(对应insert操作)

Serializable,可串行化:

最高的事务隔离级别,该级别下,事务串行化顺序执行;避免脏读、不可重复读与幻读;但是该级别效率低下,比较消耗数据库性能,一般不用。

我们下面来看看几种隔离情况下会出现的并发问题:

1.脏读

一个事务读取另一个未提交的数据。

** 2.不可重复读**

一个事务范围内,两个相同的查询却返回了不同数据。

** 3.幻读**

一个事务范围内两个相同的查询却返回了不同数据,对应的是插入操作。

** 为了方便大家记忆,我将事务的隔离级别和出现的并发问题总结了如下表格:**
特征||问题脏读不可重复读幻读读未提交√√√读提交√√×可重复读√××可串行化×××


最后祝各位宝子们读后必有所获^_^!!!

还有!还有!你还相信光吗???


本文转载自: https://blog.csdn.net/m0_46420244/article/details/125339552
版权归原作者 飘飘~ 所有, 如有侵权,请联系我们删除。

“Mysql的事务是什么?什么是脏读,什么是幻读?不可重复读?”的评论:

还没有评论