mysql事务隔离级别详解.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

wumanduo11 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档