MySQL事务和隔离级别

本文以MySQL数据库为蓝本进行讲解~

事务是什么

事务'封装'了一系列操作,使得这一系列操作变成了一个最小的工作单元,也可以理解为打包、压缩一起带走~,一起退回~

我理解的事务是:对现实世界中的正常约束行为,映射成数据库操作的行为。

例:熊妈吩咐小熊找熊爸要100块钱,熊爸给了小熊,但是熊爸给钱后,不放心,怕小熊出去浪,所以它就一直在监视小熊,看小熊到底给没给熊妈,没给,就要把钱要回来,顺带手揍一顿小熊,如果给了,熊爸心里的石头落地了,放心了,也许会抚摸着小熊的头说:熊孩子长大了。

从熊爸给钱后,开启担忧模式,直到熊妈收到钱,担忧模式关闭,这段时间就是熊爸的事务期!

事务四个特性:

1)原子性 Atomicity

熊爸不可能认可:钱交给小熊了,但是熊妈却没收到钱。熊爸只认可要么钱到熊妈手,或者及时的把钱从小熊那里拿回来。

正常解释:事务内的操作要么全成功,要么全部不成功,里面的步骤不能部分成功部分失败,我们将这样的操作映射,称之为原子性。

2)一致性 Consistency

熊爸给了小熊100,小熊反手一个素质三连,给了熊妈一张欠条,熊妈炸了,熊爸被打了,小熊说医院wifi信号真好~

或者说,小熊给了熊妈50,小熊说医院wifi信号真好~

熊妈要的是钱而不是小熊用卫生纸手绘的欠条!

我们当前的社会是和平的,是盛世,盛世之下有许多条条框框的约定,比如身份证号不能重复;高考100分,应该是上不了清华北大的;工资不能是负的,等等。

数据库的数据最终态应该也是符合现实世界约束的。如果符合这些约束条件我们就可以说这些数据是一致的,符合一致性。当然数据进行操作时我们可以check。

数据库的原子性和隔离性都是为了保证一致性的手段,在操作执行完成后保证符合所有既定的约束则是一种结果。

3)隔离性 Isolation

现实世界中的两次状态转换应该是互不影响的,比如说熊爸向熊妈同时进行的两次金额为5元的转账(假设可以在两个ATM机上同时操作)。那么最后熊爸的账户里肯定会少10元,熊妈的账户里肯定多了10元。但是对应到数据库世界中,事情又变的复杂了一些。为了简化问题,我们粗略的假设熊爸向熊妈转账5元的过程是由下边几个步骤组成的:

步骤一:读取熊爸账户的余额到变量A中,这一步骤简写为read(A)。

步骤二:将熊爸账户的余额减去转账金额,这一步骤简写为A = A - 5。

步骤三:将熊爸账户修改过的余额写到磁盘里,这一步骤简写为write(A)。

步骤四:读取熊妈账户的余额到变量B,这一步骤简写为read(B)。

步骤五:将熊妈账户的余额加上转账金额,这一步骤简写为B = B + 5。

步骤六:将熊妈账户修改过的余额写到磁盘里,这一步骤简写为write(B)。

我们将熊爸向熊妈同时进行的两次转账操作分别称为T1和T2,在现实世界中T1和T2是应该没有关系的,可以先执行完T1,再执行T2,或者先执行完T2,再执行T1,对应的数据库操作就像这样:

转账1.png 侵删

但是很不幸,真实的数据库中T1和T2的操作可能交替执行,比如这样:

转账2.jpg 侵删

如果按照上图中的执行顺序来进行两次转账的话,最终熊爸的账户里还剩6元钱,相当于只扣了5元钱,但是熊妈的账户里却成了12元钱,相当于多了10元钱!

所以对于现实世界中状态转换对应的某些数据库操作来说,不仅要保证这些操作以原子性的方式执行完成,而且要保证其它的状态转换不会影响到本次状态转换,在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,这个规则被称之为隔离性。

4)持久性 Durability

事务内的操作,一旦成功就是永久性的,不会随着时间或者数据库的崩溃而消失,比较好理解,不拿小熊举例了。

上述四个特性简称为ACID

事务的状态

  • 活跃(active)
    事务对应的数据库操作正在执行的时
  • 部分提交(partially committed)
    事务的操作执行完毕,所造成的影响并没有刷新到磁盘
  • 失败(failed)
    当事务处于活动部分提交,而遭遇到某些错误导致的失败
  • 中止(aborted)
    如果事务执行过程中发生了错误,导致状态变为failed,那么我们需要进行回滚操作,回滚操作执行完毕后,该事务就处在了中止状态
  • 已提交(committed)
    当一个处在部分提交的状态的事务将修改过的数据都同步刷新到磁盘上之后,该事务就处在了提交的状态。

二、事务的隔离级别

为什么会有事务的隔离级别?
我们可以想像一下数据库处于服务器上,每个客户端(系统连接)与数据库的连接,我们可以称之为一个会话(Session),每个客户端都可以在自己的会话内向服务器发出请求,对于数据库来说,数据库可能要同时处理多个请求。

事务有个特性就是隔离性,理论上应该是事务要进行排队,一个一个处理,彼此互不干扰,但是如果这样做就会带来性能问题,一个一个处理的时间响应肯定是不尽如人意的,我们既想保持事务的隔离性,又想让处理性能提升起来。

主流的做法就是在二者之间找平衡点。

先看一看,在并发访问同一数据且不保证串行的情况下会发生哪些情况:

1)脏写

一个事务1修改了另一个未提交事务2的数据,这就发生了脏写,伴随着未提交事务发生异常而导致的回滚,1事务操作的数据也被回滚。
我个人认为,脏写的问题无法容忍!

脏写.jpg
2)脏读

一个事务1读到了另一个未提交事务2的数据,这就发生了脏读。

脏读.png
3)不可重复读

一个事务只能读到其它已提交事务修改过的数据,并且其它事务每对该数据进行修改且提交后,该事务都能查询到最新值,这就是不可重复读。

大家注意"修改"二字!这是区别幻读的重要条件

不可重复读.png
4)幻读

在一个事务内,根据限定条件查询出一些数据,之后另外一个事务又插入了一条符合该限定条件的数据,等到原先事务再查询时,也能把刚刚插入的数据读取出来,这就是幻读。
删除操作也是幻读!

幻读.png

我们上边介绍了事务在并行时可能遇到的几种情况。

按严重程度排序 脏写 > 脏读 > 不可重复读 > 幻读

SQL标准的制定者根据上述情况制定了4中隔离级别:

1)READ UNCOMMITTED 读未提交
2)READ COMMITTED 读已提交
3)REPEATABLE READ 可重复读
4)SERIALIZABLE 串行化

4种隔离级别对应的并发情况可能发生的问题:

隔离级别对应的并发问题.jpg

大家可能注意到,为什么没有脏写呢?无它,脏写的问题太严重了,所以连隔离级别最低的 READ UNCOMMITTED 都不会允许脏写的情况发生。
MySQL的可重复读隔离级别杜绝了幻读的出现!

三、事务分配id的时机

1)读写事务执行过程中,第一次执行增删改操作,InnoDB(或其它支持事务的存储引擎)存储引擎,会为当前事务分配一个事务id,事务id是递增的。

2)对于只读事务,只有在其第一次对某个用户创建的临时表进行增删改时才会为其分配一个事务id(执行查询时用到的内部临时表并不在此范围,和手动CREATE TEMPORARY TABLE创建的用户临时表不一样)

四、结束

数据库事务和隔离级别到此为止,下一篇有可能是应用层事务使用的课题。

学习网络众多文章及掘金小册《MySQL 是怎样运行的:从根儿上理解 MySQL》自己思考、总结、归纳、整理出来的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351