日期:2014-05-16  浏览次数:20628 次

脏读-不可重复读-幻影读

脏读,不可重复读,幻影读是数据库最常见、最基础的问题。

我参照 http://blog.csdn.net/alex197963/article/details/1580841 里的讲述,夹杂自己的实践写点。

?

前提:我说的是数据在隔离情况下,如何保证数据的可靠性,以及尽量保证数据库的性能。

?

?

?

事务场景 是这样的:
对于同一个银行帐户A内有200元,甲进行提款操作100元,乙进行转帐操作100元到B帐户。如果事务没有进行隔离可能会并发如下问题:

?

脏读---读取未提交的数据---Read uncommitted

要点:应用程序中,维护了不同的变量去同步数据库。

分析:既然是数据隔离,不会在同一事务。

????? 如果没有本地变量或缓存辅助,是不可能发生这种情况的,因为当前主流的数据库都是提交了之后,其他的访问才能知道。

????? 这个问题主要存在于应用程序中。举例,Hibernate的缓存可能会产生脏读。如,javabean修改但没有保存在数据库中时,操作的业务数据存在于内存中(Hibernate控制)。

????? 场景描述:数据库 银行帐户A内有200元。A读取时是200元(放在缓存里),取出100元(缓存中A账户的余额改为100元)。B要转账100元,如果余额在缓存中取,则缓存中的账户余额将变为0元。倘若A撤销刚才的取钱操作,账户将变为200元(如果以A查询出的200元为基础)。这样,A账户的最终金额将会是200或者0元,到底是谁,决定于谁提交,A提交账户是200,B提交账户将是0元(如果以B查询出的100元为基础)。但实际上应该为100元。

????? 解决方法:维护一个实例。