本文作者:苏生米沿
本文地址:http://blog.csdn.net/sushengmiyan/article/details/50551741
当我们谈起隔离的时候,我们总是假定两个物体直接要么隔离要么不隔离;但是实际上,两者直接没有那么明显的界限。
当我们说数据库的事务的时候,完全隔离需要花费高的代价。你不能阻止世界用多用户联机事务处理系统获取数据。
因此,有很多的隔离级别可以供我们选择。当然,其中有些选项,是隔离级别较弱的,但是能提升性能和系统的伸缩性。
事务隔离级别
1.
2.
3.
事务隔离性问题
首先,我们看一下几个消弱隔离性的几个可能会出现的场景,ANSI SQL标准定义了几个数据库系统允许的隔离性级别。
图11.1展示了更新丢失的问题:两个对一行数据的更新同时进行,第一个更新先完成,第二个发生了异常,此时回滚,那么第一个修改的就会连带回滚,数据丢失。这发生在没有锁的系统中,此时没有隔离并发事务。
图11.2展示了脏读的发生情况: 脏读取出现在一个事务读另一个事务修改但是还没有提交的数据的时候。这很危险,因为另一个事务进行的改变很可能会回滚,并且第一个事务可能会得到非法数据(and invalid data may be written by the first transaction);
图11.3展示了读不重复数据的情况:这时,事务两次读取数据,并且两次读取的数据是不一致的。例如,两次读取的时候,另一个事务对其进行了更新,导致两次读取数据不一致。
图11.4展示了后更新覆盖先更新的问题:读不重复的一个特殊情况就是后提交者获胜。假设两个并发的事务都读取数据,一个更新它并提交,另一个也更新并提交,那么最终是以第二个更新为准的,第一个更新就被覆盖了。这种情况对用户来说是很有迷惑性的,A用户在不被知晓的情况下,被B的数据覆盖掉了,B通过一个过时的信息做出了决定。
图11.5展示了幻读的情况:这是说,在一个事物两次查询的过程中,有另一个事务,对其数据进行了删除或者插入操作,两次读的就出现了不同的情况。
既然你知道了会发生的最坏的情况,我们将会定义隔离级别和看各种级别能解决哪些问题。