??xml version="1.0" encoding="utf-8" standalone="yes"?>
在该隔离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)
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 />