事务隔离级别和传播行为_Spring事务隔离级别和传播行为

先说下数据读取的几个异常情况:

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吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值