MySQL事务的隔离性

什么是事务的隔离级别

事务的隔离级别,老生常谈的问题了,指多个事务并发执行的时候相互之间不受到彼此的干扰,根据隔离程度对隔离性有会分类。在具体介绍事务隔离性前有必要介绍几个名词说明数据库并发操作存在的问题。

脏读

事务可以读取未提交的数据,就被称为脏读。 -------《高性能MySQL》

从定义来看,这个很好理解,举个例子来说:假如有两个事务AB同时更新一个数据c=1,事务A执行select语句获取到c=1,然后事务A将数据更改为c=2但是没有提交事务。这时候事务B执行select发现此时的数据为c=2,这样就产生了脏读。

不可重复读

事务在提交前可以看到其他事务已经提交的数据,导致两次读取出现不一样的结果,我们称之为不可重复读

同样举例来说明这种数据出现的情况:两个事务AB,事务A执行select操作查询出数据d=1,此时事务B将此数据更改为d=2并提交了事务,此时事务A再执行select操作时,发现数据d=2和上一次查询的结果不一样,这就导致了数据的不可重复读。

幻读

所谓幻读,是指当某个事务在读取某个范围内的记录时,另外一个事务又在改范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。 --《高性能MySQL》

上面的定义是我们理解中的定义,大部分人都是这么理解幻读,然而幻读真的是如此的吗?后面介绍隔离性的时候我们会在实际操作中验证这点。

事务的隔离级别

Read Uncommited

未提交读隔离级别,就是指一个事务中可以读取其他事务未提交的数据,这个级别会导致脏读。下面在我本机安装的mysql中验证这一点;

mysql的默认隔离级别是Repeatable Read,如下图所示:

image.png

下面我们把隔离级别改为Read Uncommited:
image.png

image.png

下面验证此隔离级别下会出现的脏读情况,打开两个终端
终端一:开启事务,查询test表中的数据,结果如下
image.png

终端二:开启事务,往test表中插入数据,但是不提交事务,结果如下

image.png

终端一:终端二插入数据以后往在终端一中执行同样的查询语句,结果如下


image.png

然后将终端二中的事务回滚,此时在终端一中的事务中查询数据,发现刚才插入的数据又消失了
终端二:


image.png

终端一:


image.png

从上图发现,在终端二中的事务没有提交的情况下,终端一中的事务就能够读取到插入的数据,所以在 read-uncommitted隔离条件下就会产生脏读的情况。这个隔离级别是最低的隔离级别,上面所说的脏读、不可重复读和幻读等情况都会出现,所以一般来说不使用此隔离级别。

Read Committed

提交读隔离级别,一个事务开始时,只能读取到已经提交的事务所做的修改。这个隔离级别会出现不可重复读的情况
修改数据库的事务隔离级别为Read Committed:

image.png

终端一:


image.png

终端二:

image.png

终端一:
image.png

从上面两个终端的截图发现,终端二中的事务在没有提交事务的情况下,修改的数据在终端一中是查询不到的,提交事务,再查看结果
终端二:
image.png

终端一:
image.png

从上面结果看出,终端二中的事务提交以后,在终端一中可以查询出结果。
该隔离级别下面会出现不可重复读和幻读的情况,但是不会出现脏读的情况,oracle的默认隔离级别就是提交读的隔离级别。

Repeatable Read

可重复读隔离级别,保证同一个事务在多次读取同样的结果中是一致的。
修改隔离级别


image.png

我们按照《高性能MySQL》上的说法做一个实验,看看是否会出现幻读的情况:
终端一:


image.png

终端二:
image.png

image.png

终端一:


image.png

从上面来看,并没有出现幻读的情况,终端一中的数据集并没有发生改变。其实幻读不能理解成读-读的过程,而是应该理解为读-写的过程,事务在插入事先检测不存在的记录时,惊奇的发现这些数据已经存在了,之前监测到的数据中多了一行,像产生幻觉一样。怎么理解上面那句话呢,下面这个例子就能很好的解释这一点:
事务一:
执行sql:
select * from test where id = 3;
执行结果为null,证明没有主键 id=3的这行数据
事务二:
执行sql:
insert into test(id,num,date) values(3,3,now());
然后提交事务二
事务一:
执行sql:
insert into test(id,num,date) values(3,3,now());
执行此 sql时发现报错,显示已经有id=3数据,就像产生幻觉,明明是没有数据,为什么突然出现这行数据呢!!!

Serializable

可串行化隔离级别,强制事务串行执行,这种隔离级别在实际使用中很少用,所以不做过多的介绍。

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

推荐阅读更多精彩内容