谈谈Spring事务隔离级别和传播行为

事务隔离级别 (先从数据库的隔离级别开始说起吧 )
 
事务特性(4种):
原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库
 
 
脏读 、幻读、不可重复读
脏读:事务A读到了事务B未提交的数据,如果事务B出现异常回滚,就会导致事务A读到的数据是脏数据
 
不可重复读: 如果A事务多次读取同一个数据,事务B在事务A多次读去的过程中,更新了事务A读取的数据,就会导致事务A读取一个数据前后不一致问题
 
幻读: 幻读多出现在多数据进行进行修改和统计,如果事务A在进行多数据统计,突然事务B插入一个数据,当事务A做到最后,突然发现多出来一个数据,感觉像幻觉一样。
 
总结 :不可重复读和幻读的区别 :不可重复读侧重于单个数据的修改,而幻读侧重于数据的删除和新增。不可重复读可以通过锁行解决。但是幻读需要通过锁表来解决。
 
事务隔离级别(Mysql的默认隔离级别位repeatable-read   Oralce默认隔离级别 read-committed)
 
 
Spring框架的隔离级别
    DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
    未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
    已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
    可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
    串行化的 (serializable) :避免以上所有读问题.
 
Spring的事务传播级别(事务的传播级别是一个事务调用另一个事务的规范,在spring中就是service层对象相互调用的规范)
Required      如果没有被事务包裹,创建事务;  如果被事务包裹,融入外部事务    (适合增删改)

supports      如果被事务包裹,不创建事务  ;如果被事务包裹 ,融入外部事务     (适合查询)

requires_new  如果被包裹 ,挂起外部事务,创建自己的事务  ; 如果没有事务包裹,开启事务    

no_supported    外面有没有事务,都不需要事务   什么都不要

never       如果没有被事务包裹,不开启新事务  ;如果被事务包裹,抛出异常

mandatory    如果没有被事务包裹 ,就抛出异常 ;如果被事务包裹 就融合外部事务

nested    如果被事务包裹,就融入事务  ;如果没有,创建新事务

 

 
基于XML声明式事务的配置
<!-- 事务控制器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>


<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="pointPut" expression="execution(* com.xc.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointPut"/>
</aop:config>
<tx:method>属性值
isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚

 

 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值