先说下数据读取的几个异常情况:
1.读取脏数据(Dirty reads)。就是读取到了其他事务没有提交的数据。比如2个并发的事务A,B。A修改了字段age(原来为18)的值为20,这时B读取到age的值为20。如果A事务在后面的操作中回滚了,这样事务B取的age=20就是个脏数据。这种情况发生的很少,因为主流的数据库的隔离级别都能保证避免脏数据的读取。
2.不可重复读(non-repeatable reads)。就是修改了其他事务已经读取的数据。比如2个并发的事务A,B。A读到字段age=18。这时B对改字段做了修改age=20。这样事务A如果再次读取age时就会发现两次得到的数据是不同的。
3.幻读(phantom reads)。它和不可重复读类似,但也不同,它不是修改其他事务已经读取的数据,而是新增了其他进程没有读到的数据。这样会造成这种情况:A读取user_info表的记录数是100,事务B新增了2条记录,这样A再次读取时就会发现记录数成了102,数据不一致了。
而事务的隔离级别就是为了防止以上数据不一致的情况发生。
Dirty reads non-repeatable reads phantom readsSerializable 不会 不会 不会REPEATABLE READ 不会 不会 会READ COMMITTED 不会 会 会Read Uncommitted 会 会 会
实现原理就是对数据库表进行加锁。
Read Uncommitted自然是不加锁,READ COMMITTED是读取时对读取的行加锁,读取完成之后就解锁。REPEATABLE READ也是读取的内容加锁,但解锁是要等到所在事务提交。Read Uncommitted就是全表加锁。
Serializable的隔离级别效率太差,hibernate默认的隔离级别是REPEATABLE READ,不保证避免幻读。
配置的话具体见spring手册,下面从网络上考的一段配置文件:
class="org.springframework.transaction.jta.JtaTransactionManager">
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
sample.services.OrderService
PROPAGATION_REQUIRED, ISOLATION_SERIALIZABLE
PROPAGATION_REQUIRED, ISOLATION_READ_UNCOMMITTED
PROPAGATION_REQUIRED, ISOLATION_READ_UNCOMMITTED,
readOnly
分享到:
2012-03-29 19:45
浏览 2665
评论
1 楼
923080512
2014-03-18
lz下面这句话写错了:
Read Uncommitted就是全表加锁
应该是Serializable吧