日期: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元。
????? 解决方法:维护一个实例。