提示:虽然事务在实际工作中的作用不是很大,但在校招笔试,面试中是数据库的重点考试题目!!!所以宝子们要打起十二分精神阅读本篇文章!!!
前言:
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.幻读**
一个事务范围内两个相同的查询却返回了不同数据,对应的是插入操作。
** 为了方便大家记忆,我将事务的隔离级别和出现的并发问题总结了如下表格:**
特征||问题脏读不可重复读幻读读未提交√√√读提交√√×可重复读√××可串行化×××
最后祝各位宝子们读后必有所获^_^!!!
还有!还有!你还相信光吗???
版权归原作者 飘飘~ 所有, 如有侵权,请联系我们删除。