数据库的脏读、不可重复读、幻读

上一篇 / 下一篇  2012-08-15 09:40:42 / 个人分类:数据库

51Testing软件测试网A Oq8n.F;]

  数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。

.J/ulm'vT)wQ4_051Testing软件测试网a,g6H.nS9{#m/h

  事务的4大特性(ACID):51Testing软件测试网Z8de"p7tJ]k#n

51Testing软件测试网7XCT S/z/y.c.U

  1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。

EI BsuD051Testing软件测试网 } K$?,T*s#XQ*^4i

  2、一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束。51Testing软件测试网1@#c:p#Jp5D

51Testing软件测试网*z$Z NC%P+g

  3、隔离性(Isolation):并发执行的N个事务是隔离的,一个不影响一个,一个事务在没有commit之前,被修改的数据不可能被其他事务看到(通过设置数据库的隔离级别)。

1Lx BR2R3eu?x0

#?FYVx Y0  4、持久性(Durability):持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性主要在于DBMS的恢复性能。

)^7Z8hOw$V"J.HtV0

B5n!F P3jS0  脏读:

`9h+H)R WZD0

5cJ i H aC+L+i9v0  脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。51Testing软件测试网Iaje @,Q$b'{,I4?

7?eA~U@,W!Z j0  例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。51Testing软件测试网;k}QN/g K'ln

51Testing软件测试网 b.ETo T Ww

  解决办法:把数据库的事务隔离级别调整到READ_COMMITTED51Testing软件测试网FiB/l)cG;X.X

)WW6V!U QiB0  不可重复读:51Testing软件测试网if(jm7SyqX

3dr&uH `gD%Wzc0  不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

6Fkv1h8^)se0

zE\)E"X3[ e5A0  例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

a.UMFamVU0

1_]D|%X.s:B#Re0  解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ

RG0yFw2_C0

mIz0R_1Eh.W0  幻读:51Testing软件测试网,BhN%w5e T y.O

51Testing软件测试网V8v6tgD K#gB

  例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。

\(wh5N'`;q051Testing软件测试网G,wI)q.hD#] a

  解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ51Testing软件测试网7ZGy5r6L

Wq)xI CWU0  脏读、不可重复读、幻读的级别高低是:脏读 < 不可重复读 < 幻读。所以,设置了最高级别的SERIALIZABLE_READ就不用在设置REPEATABLE_READ和READ_COMMITTED了。51Testing软件测试网 L'u8p Yt


TAG:

 

评分:0

我来说两句

Open Toolbar