`

Spring事务学习

 
阅读更多
  • 基本概念

spring可以通过下面两种方式实现事务

声明式事务:通过注解或XML配置文件指定事务信息

编程式事务:通过编写代码实现事务

使用声明式事务只需修改配置文件,不用编写侵入式的代码就能实现事务管理,这里只介绍声明式事务。

 

事务传播行为

Required:必须有逻辑事务,否则新建一个事务,使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务
RequiresNew:创建新的逻辑事务,使用PROPAGATION_REQUIRES_NEW指定,表示每次都创建新的逻辑事务
Supports:支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务,如果当前没有逻辑事务,就以非事务方式执行
NotSupported:不支持事务,如果当前存在事务则暂停该事务,使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行
Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出异常(IllegalTransactionStateException)
Never:不支持事务,如果当前存在是事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常(IllegalTransactionStateException)
Nested:嵌套事务支持,使用PROPAGATION_NESTED指定,如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚

 

事务隔离级别

ISOLATION_DEFAULT:默认隔离级别,即使用底层数据库默认的隔离级别

ISOLATION_READ_UNCOMMITTED:未提交读

ISOLATION_READ_COMMITTED:提交读,一般情况下我们使用这个

ISOLATION_REPEATABLE_READ:可重复读

ISOLATION_SERIALIZABLE:序列化

 

  • 事务管理器

spring提供了事务管理器PlatformTransactionManager,这只是一个接口。对于不同的持久层框架,用不同的实现类。以Hibernate为例,需要配置

<bean id="txManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
        <property name="sessionFactory" ref="sessionFactory" />   
</bean>

 

 
  • 事务通知
<tx:advice id="txAdvice" transaction-manager="txManager">  
    <tx:attributes>  
        <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>  
        <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>  
    </tx:attributes>  
</tx:advice>

<tx:advice>:事务通知定义,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过< tx:attributes >指定具体需要拦截的方法

<tx:method>:用于定义事务属性即相关联的方法名,有以下属性

name:定义与事务属性相关联的方法名,将对匹配的方法应用定义的事务属性,可以使用“*”通配符来匹配一组或所有方法,如“save*”将匹配以save开头的方法,而“*”将匹配所有方法
propagation:事务传播行为定义,默认为“REQUIRED”
isolation:事务隔离级别定义;默认为“DEFAULT”
timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统
read-only:事务只读设置,默认为false,表示不是只读
rollback-for:需要触发回滚的异常定义,以“,”分割,默认任何RuntimeException将导致事务回滚
no-rollback-for:不被触发进行回滚的 Exception(s) 以“,”分割

 

最后用aop启动该事务

<aop:config>  
    <aop:pointcut id="transactionPointcut" expression="execution(* com.company.service..*Impl.*(..))"/>  
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="txAdvice"/>  
</aop:config>

 

  • 使用注释配置事务

spring支持以@Transactional替代配置文件里面的tx:advice

首先用<tx:annotation-driven transaction-manager="txManager"/>开启对注解事务管理的支持,从而能识别Bean类上的@Transactional注解元数据。

 

@Transaction来指定事务属性,可以在接口、类或方法上指定,优先级顺序为方法>实现类>接口。具有如下属性

value:指定事务管理器名字,默认使用<tx:annotation-driven/>指定的事务管理器,用于支持多事务管理器环境
propagation:指定事务传播行为,默认为Required,使用Propagation.REQUIRED指定
isolation:指定事务隔离级别,默认为“DEFAULT”,使用Isolation.DEFAULT指定
readOnly:指定事务是否只读,默认false表示事务非只读
timeout:指定事务超时时间,以秒为单位,默认-1表示事务超时将依赖于底层事务系统
rollbackFor:指定一组异常类,遇到该类异常将回滚事务
rollbackForClassname:指定一组异常类名字,其含义与<tx:method>中的rollback-for属性语义完全一样
noRollbackFor:指定一组异常类,即使遇到该类异常也将提交事务,即不回滚事务
noRollbackForClassname:指定一组异常类名字,其含义与<tx:method>中的no-rollback-for属性语义完全一样

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics