- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MySQL 事务隔离级别详解
SQL 标准定义了 4 类隔离级别, 包括了一些具体规则, 用来限定 事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般 支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted (读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结 果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多 少。读取未提交的数据,也被称之为脏读( Dirty Read )。 Read Committed (读取提交内容)
这是大多数数据库系统的默认隔离级别 (但不是MySQ默认的)。 它满足了隔离的简单定义: 一个事务只能看见已经提交事务所做的改变。 这种隔离级别也支持所谓的不可重复读( Non repeatable Read),因为 同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。
Repeatable Read (可重读)
这是MySQ的默认事务隔离级别,它确保同一事务的多个实例 在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一 个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取 某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再 读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon
存储引擎通过多版本并发控制( MVC,C Multiversion Concurrency Control )机制解决了该问题。
Serializable (可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互 冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享 锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现, 若读取的是同一个 数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在 此时读取了同一份数据,由于某些原因,前一个 RollBack 了操作,则 后一个事务所读取的数据就会是不正确的。
不可重复读 (Non-repeatable read): 在一个事务的两次查询之 中数据不一致, 这可能是两次查询过程中间插入了一个事务更新的原有 的数据。
幻读 (Phantom Read): 在一个事务的两次查询中数据笔数不一 致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插 入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数 据是它先前所没有的。
在MySQ中,实现了这四种隔离级别,分别有可能产生问题如下所示:
隔离级别
脏读
不可重复读
幻词
渎未提交(Readuncommitted)
V
V
V
读己提交(Readcommitted)
X
V
V
可重复读(Repeatable read)
X
X
V
可串行化(Serializable)
X
X
X
下面,将利用MySQ的客户端程序,分别测试几种隔离级别。测试数据 库为test,表为tx ;表结构:
id int
num int
两个命令行客户端分别为 A, B;不断改变A的隔离级别,在B端修改数 据。
(一)、将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:
use resc;
Dateabase changed
myql^ select GPtx_lso 1-at ion ;
TOC \o 1-5 \h \z + r
! (?etx_isolation !
:READ-UNCOMrilTTEI) i
+ r
1 row in set 6.60 sec)
mysql start transaction:
OK, 0 affected 9-^0 sec)
nyeql select * fvon ty:
■--
—
■■母
I I
id
1
I
nun
a ?
1
-+-
—
1
i
1
I
■
1
?
■
I
I
2
1 p
2
i
1
I
1
3
1
1
3
1
1
1
—
-+-
-+
3 t*ows in set t首■越陌 sec
B更新数据:
客户端B:
nysq:L update tx set nurr=10 whepe id=l; Qu.epy OK, 1 fdij afFectedt 0-00 sec Rons matched: 1 Changed: 1 Warnings: 0
mys(iL selftct * fi*rt tx;
+ 4 4
id nun
3 rows in set 0.00 nys(il rollb€tc:k;
Qu.ery OK, 8 r
原创力文档


文档评论(0)