??xml version="1.0" encoding="utf-8" standalone="yes"?>日本视频一区在线观看 ,亚洲人体一区,青青青免费视频在线2http://www.aygfsteel.com/qbna350816/category/55123.html201103zh-cnFri, 23 Sep 2016 16:36:32 GMTFri, 23 Sep 2016 16:36:32 GMT60MySQL事务隔离U别详解http://www.aygfsteel.com/qbna350816/archive/2016/09/24/431834.html胡小?/dc:creator>胡小?/author>Fri, 23 Sep 2016 16:06:00 GMThttp://www.aygfsteel.com/qbna350816/archive/2016/09/24/431834.htmlhttp://www.aygfsteel.com/qbna350816/comments/431834.htmlhttp://www.aygfsteel.com/qbna350816/archive/2016/09/24/431834.html#Feedback0http://www.aygfsteel.com/qbna350816/comments/commentRss/431834.htmlhttp://www.aygfsteel.com/qbna350816/services/trackbacks/431834.htmlSQL标准定义?c隔ȝ别,包括?jin)一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低U别的隔ȝ一般支持更高的q发处理Qƈ拥有更低的系l开销?br />Read UncommittedQ读取未提交内容Q?/strong>

       在该隔离U别Q所有事务都可以看到其他未提交事务的执行l果。本隔离U别很少用于实际应用Q因为它的性能也不比其他别好多少。读取未提交的数据,也被UC读(Dirty ReadQ?br />Read CommittedQ读取提交内容)(j)

       q是大多数数据库pȝ的默认隔ȝ别(但不是MySQL默认的)(j)。它满?jin)隔ȝ单定义:(x)一个事务只能看见已l提交事务所做的改变。这U隔ȝ?也支持所谓的不可重复读(Nonrepeatable ReadQ,因ؓ(f)同一事务的其他实例在该实例处理其间可能会(x)有新的commitQ所以同一select可能q回不同l果?br />Repeatable ReadQ可重读Q?/strong>

       q是MySQL的默认事务隔ȝ别,它确保同一事务的多个实例在q发d数据Ӟ?x)看到同L(fng)数据行。不q理ZQ这?x)导致另一个棘手的问题Q?QPhantom ReadQ。简单的_(d)q读指当用户d某一范围的数据行Ӟ另一个事务又在该范围内插入了(jin)新行Q当用户再读取该范围的数据行Ӟ?x)发现有新?#8220;qd(jing)” 行。InnoDB和Falcon存储引擎通过多版本ƈ发控ӞMVCCQMultiversion Concurrency ControlQ机制解决了(jin)该问题?/span>

SerializableQ可串行化)(j) 
       q是最高的隔离U别Q它通过强制事务排序Q之不可能怺冲突Q从而解军_读问题。简a之,它是在每个读的数据行上加上共享锁。在q个U别Q可能导致大量的时现象和锁竞争?/span>

         q四U隔ȝ别采取不同的锁类型来实现Q若d的是同一个数据的话,容易发生问题。例如:(x)

         脏读(Drity Read)Q某个事务已更新一份数据,另一个事务在此时d?jin)同一份数据,׃某些原因Q前一个RollBack?jin)操作,则后一个事务所d的数据就?x)是不正的?/span>

         不可重复?Non-repeatable read):在一个事务的两次查询之中数据不一_(d)q可能是两次查询q程中间插入?jin)一个事务更新的原有的数据?/span>

         q读(Phantom Read):在一个事务的两次查询中数据笔C一_(d)例如有一个事务查询了(jin)几列(Row)数据Q而另一个事务却在此时插入了(jin)新的几列数据Q先前的事务在接下来的查询中Q就?x)发现有几列数据是它先前所没有的?/span>

         在MySQL中,实现?jin)这四种隔离U别Q分别有可能产生问题如下所C:(x)


下面Q将利用MySQL的客L(fng)E序Q分别测试几U隔ȝ别。测试数据库为testQ表为txQ表l构Q?/span>

id                              int

num

                              int

两个命o(h)行客L(fng)分别为AQBQ不断改变A的隔ȝ别,在B端修Ҏ(gu)据?/span>

Q一Q、将A的隔ȝ别设|ؓ(f)read uncommitted(未提交读)

 在B未更新数据之前:(x)

客户端AQ?/span>

B更新数据Q?/span>

客户端BQ?/span>

客户端AQ?/span>

        l过上面的实验可以得出结论,事务B更新?jin)一条记录,但是没有提交Q此时事务A可以查询出未提交记录。造成脏读现象。未提交L最低的隔离U别?/span>

Q二Q、将客户端A的事务隔ȝ别设|ؓ(f)read committed(已提交读)

 在B未更新数据之前:(x)

客户端AQ?/span>

B更新数据Q?/span>

客户端BQ?/span>

客户端AQ?/span>

       l过上面的实验可以得出结论,已提交读隔离U别解决?jin)脏ȝ问题Q但是出C(jin)不可重复ȝ问题Q即事务A在两ơ查询的数据不一_(d)因ؓ(f)在两ơ查询之间事务B更新?jin)一条数据。已提交d允许d已提交的记录Q但不要求可重复诅R?/span>

(??span style="font-size: medium;">A的隔ȝ别设|ؓ(f)repeatable read(可重复读)

 在B未更新数据之前:(x)

客户端AQ?/span>

B更新数据Q?/span>

客户端BQ?/span>

客户端AQ?/span>

B插入数据Q?/span>

客户端BQ?/span>

客户端AQ?/span>

       ׃上的实验可以得出l论Q可重复读隔ȝ别只允许d已提交记录,而且在一个事务两ơ读取一个记录期_(d)其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生q读问题(注意是可能,因ؓ(f)数据库对隔离U别的实现有所差别)。像以上的实验,没有出现数据ȝ问题?/span>

(??span style="font-size: medium;">A的隔ȝ别设|ؓ(f) 可串行化 (Serializable)

A端打开事务QB端插入一条记?/span>

事务A端:(x)

事务B端:(x)

因ؓ(f)此时事务A的隔ȝ别设|ؓ(f)serializableQ开始事务后Qƈ没有提交Q所以事务B只能{待?/span>

事务A提交事务Q?/span>

事务A?/span>

事务B?/span>

      
 serializable完全锁定字段Q若一个事务来查询同一份数据就必须{待Q直到前一个事务完成ƈ解除锁定为止 ?/span>是完整的隔离U别Q会(x)锁定对应的数据表|因而会(x)有效率的问题?br />

 转自Qhttp://xm-king.iteye.com/blog/770721


]]>
վ֩ģ壺 ޭ| п| | ͳ| ɽ| | | | | | ɫ| Ž| | ͬ| | | | ɽ| ͨ| | | ϰˮ| ɽ| ɽ| | ɽ| | | | ͡| ̩| ͨ| ӽ| | | | | Ϫ| ɽ| | |