日期:2014-05-16 浏览次数:20542 次
?
事物隔离级别(转)
以前一直没有搞得特别明白,这次又碰上了这个问题,整理一下。
事物隔离级别定义在数据库并发事务中一个事务中的数据修改对另一个同时运行的事务的影响。
数据库并发事务中的三个问题:
Dirty Read: 如果能够读物没有提交的事务所做的数据修改,就会发生脏读的问题。因为事务有可能回滚。
Nonrepeatable Read: 这个主要是因为在一个事物中的两次读数据之间,另一个事务对同样的数据进行了修改,直接导致两次读取的数据不一致。
Phantom Read: 这个可以看成是Nonrepeatable Read的一种特殊情况。两次读之间的不一样的数据是另一个事务添加并提交的记录。只有当添加记录时才会出现这个问题。
为了解决这三个问题,SQL标准中定义了四种事务隔离级别
Serailizable:
所有的事务完全隔离。看起来就像一个事务完成后再去执行另一个事务。
不会出现幻象读取(phantom reads)
在基于锁的并发控制中,当查询带有where子句时,串行化要求区域锁(range locks)
在其他的并发控制中,当串行化冲突发生后,事务要回滚,然后再重新开始。
Repeatable Read:
所有读取中的记录不能被修改。读取记录需要加读取锁,不需要区域锁,当查询带有where子句时,可能出现幻象读取。
Read Committed:
读取中的记录可能会被另一个事务进行修改。不可重复读可能出现。
Read Uncommited:
一个事务能够访问另一个事务未提交的修改。会出现脏读
四种隔离级别分别能够解决的问题:
Isolation Level ?Dirty Read ?Nonrepeatable Read ?Phantom Read
READ UNCOMMITTED ?Permitted ?Permitted ? ? ? ? ?Permitted
READ COMMITTED ? ? ? ? ?-- ? ? ? ? ?Permitted ? ? ? ? ?Permitted
REPEATABLE READ ?-- ? ? ? ? ?-- ? ? ? ? ? ? ? ? ?Permitted
SERIALIZABLE ? ? ? ? ?-- ? ? ? ? ?-- ? ? ? ? ? ? ? ? ?--
其它广泛使用的隔离方法:
snapshot isolation:
当读取数据时,系统生成为这个事务一个快照,这个快照在整个事务中使用,这样来保证数据在这个事务中的一致性。
更新操作同样发生在这个快照上,在事务提交之前,不会与任何其它事务所做的修改冲突。
当提交事务时,系统检查这些修改的数据在快照之后是否被其他事务修改,如果没有修改,这个事务就可以提交了。
如果有修改,这个事务就需要回滚再重新执行。
snapshot isolation 能够避免并发事务的三个问题。
?
?