数据库隔离相关内容

在一个应用中,依据事务的隔离级别将会有三种情况发生。
脏读(dirty read): 当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不可重复读(non-repeatable read): 同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。:
幻像读(phantom read): 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

1.Read Committed:
假设A事务对正在读取数据Data放置了共享锁,那么Data不能被其它事务改写,所以当B事务对Data进行读取时总和A读取的Data数据是一致的,所以避免了脏读。由于在A没有提交之前可以对Data进行改写,那么B读取到的某个值可能会在其读取后被A更改从而导致了该值不能被重复取得;或者当B再次用相同的where字句时得到了和前一次不一样数据的结果集,也就是幻像数据。

2.Read Uncommitted:
假设A事务即不发布共享锁,也不接受独占锁,那么并发的B或者其它事务可以改写A事务读取的数据,那么并发的C事务读取到的数据的状态和A的或者B的数据都可能不一致,那么。脏读、不可重复读、幻象数据都可能存在。

3.Repeatable Read:
(注意MSDN原文中的第一句话:在查询中使用的所有数据上放置锁,所以不存在脏读的情况)。
假设A事务对读取的所有数据Data放置了锁,以阻止其它事务对Data的更改,在A没有提交之前,新的并发事务读取到的数据如果存在于Data中,那么该数据的状态和A事务中的数据是一致的,从而避免了不可重复的读取。但在A事务没有结束之前,B事务可以插入新记录到Data所在的表中,那么其它事务再次用相同的where字句查询时,得到的结果数可能上一次的不一致,也就是幻像数据。

4.Serializable:
在数据表上放置了排他锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行,这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。

以下是对照表:


一般的应用作隔离级别时,往往采用(2),(3)两种,(1),(4)两种前者轻后者重。

Hibernate为了提高performance和scalability,在数据库一层中采用的是(2)的隔离级别,然后在程序中进行控制,从而实现了(3)的隔离级别,因此提高了企业应用的事务处理效率。当然Hibernate对于数据库一层的隔离级别也可以显示指定。Hibernate在程序中的控制方法有:version number, timestamp,对于遗留database也有optimistic-lock,而version number有时不能解决特殊的事务并发引起来的(3)问题,那么就需要针对特殊情况进行细粒度的事务控制,可以看一下LOCKMODE。

并不是所有的数据库都支持这4咱隔离级别,Oracle只支持 2、4两个隔离级别


常见数据库的默认隔离级别

MySql: 默认为REPEATABLE_READ级别(3)

PostgreSQL默认隔离级别是READ COMMTIED

SqlServer: 默认为READ_COMMITTED(2)

Oracle: 默认为READ_COMMITTED(2)

oracle事务有自己的优势,读不阻塞更新操作。读取操作不用等待更新事务的结束,更新操作不会因另一个事务中的读取而发生等待。 oracle的READ_COMMITTED比SQL标准多了一个“一致读”。

各个数据库支持的隔离级别

ANSI SQL92标准规定了四种隔离级别,read uncommitted、read committed、repeatable read、serializable isolation。随着数据库的发展,这已经越来越跟不上数据库的发展,不同厂家的数据库在相同的隔离级别下,在细微处可能表现出不同的行为,比如同为read committed,Oracle、DB2和sybase的表现行为就不同。


所有隔离级别
不同厂家的数据库产品支持的隔离级别名称略有不同;

SYBASE支持的隔离级别:degree 0(read uncommitted)、degree 1(read committed)、degree 2(repeatable read)、degree 3(serializable isolation);

ORACLE支持的隔离级别:read committed(consistent read)、serializable(snapshot isolation);

DB2支持的隔离级别:read uncommitted、cursor stability、read stability、repeatable read;

Postgresql支持的隔离级别:read committed(consistent read)、repeatable read(snapshot isolation)、serializable isolation(Serialaizable Snapshot Isolation);

SQL Server支持的隔离级别:read uncommitted、read committed snapshot 、read committed 、repeatable read、snapshot isolation、serializable isolation;

MySQL支持的隔离级别:read uncommitted、read committed(consistent read)、repeatable read(snapshot isolation)、serializable isolation;

参考文章: http://blog.csdn.net/delove3/article/details/9750267