Spring声明式事务管理的两种方式(XML和Annotation)

Spring声明式事务管理

Spring的声明式事务管理是通过Spring AOP实现的,Spring提供了声明式的回滚规则:我们可以自己指定什么样的异常会导致回滚。


XML版配置

<!-- AOP事务管理start。。。 -->
<!--HibernateTransactionManager类中有setSessionFactory(),将sessionFactory注入-->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

<!--将我们想要施加在事务中的语义封装在<tx:advice/>中,其中默认的设置为:事务性传播设置是REQUIRED;隔离级别为DEFAULT;事务是读/写;事务超时默认是依赖于事务系统的,或者事务超时没有被支持;任何 RuntimeException将触发事务回滚,但是任何checked Exception 将不触发事务回滚。-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="test*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>    

<!--设置一个pointcut确保由"txAdvice"bean定义的事务通知在应用中合适的点来执行,然后使用一个通知器(advisor)将该切面与txAdvice绑定到一起,其中expression的属性是织入点语法,com.niu.service包下任意包(..)的任意实现类(*)的任意方法(*)参数任意(..)-->
    <aop:config>
        <aop:pointcut expression="execution(public * com.niu.service..*.*(..))" id="transactionAop"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionAop"/>
    </aop:config>
<!-- AOP事务管理end。。。 -->

以上配置为service层的一些方法加入了事务管理,当它们被调用时,一个事务将被启动、挂起、被标记为只读,或者其他(取决于你定义的语义)。

回滚规则:

<!--指定异常回滚类型-->
<tx:method name="save*" propagation="REQUIRED" 
rollback-for="NoProductInStockException"/>

<!--即使遇到没有经过处理的InstrumentNotFoundException异常,也不要回滚事务-->
<tx:method name="save*" propagation="REQUIRED" 
no-rollback-for="InstrumentNotFoundException"/>

<tx:method>设置

属性是否需要默认值描述
name与事务属性关联的方法名。
propagationREQUIRED事务传播行为
isolationDEFAULT事务隔离级别
timeout-1事务超时时间,以秒为单位
readonlyfalse事务是否只读
rollback-for将被触发回滚的Exception,以逗号隔开
no-rollback-for不被触发回滚的Exception,以逗号隔开

注解版配置

<beans xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation=
        "http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--启动注解版事务管理开关-->
<tx:annotation-driven transaction-manager="txManager"/>

<beans/>

在xml中的配置工作就完成了,将@Transactional标签加入需要开启事务管理的接口定义、接口方法、类定义、类方法(public)上。注:@Transactional只是一种元数据,根本在于tx:annotation-driven标签开启了事务。建议将@Transactional 使用在具体类(方法)上。

tx:annotation-driven配置

属性默认值描述
transaction-managertransactionManager使用的事务管理器的名字。
modeproxy默认的模式“proxy”会用Spring的AOP框架来代理注解过的bean;另一种可行的模式“aspectj”会使用Spring的AspectJ事务切面来编织类
proxy-target-classfalse只对代理模式有效。决定为那些使用了@Transactional注解的类创建何种事务代理。 如果 “proxy-target-class” 属性被设为 “true”, 那么基于类的代理就会被创建。如果 “proxy-target-class”属性被设为”false” 或者没设,那么基于接口的标准JDK代理就会被创建。
orderOrdered.LOWEST_PRECEDENCE定义事务通知的顺序会作用到使用@Transactional注解的bean上

@Transactional注解的属性

属性类型描述
propagation枚举型:Propagation可选的传播性设置
isolation枚举型:isolation可选的隔离性级别(默认值:ISOLATION_DEFAULT)
readOnly布尔型读写型事务 vs. 只读型事务
timeoutint型(秒为单位)事务超时
rollbackFor一组 Class 类的实例,必须是Throwable 的子类一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚
rollbackForClassname一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须进行回滚
noRollbackFor一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须不回滚
noRollbackForClassname一组 Class 类的名字,必须是Throwable的子类一组异常类名,遇到时必须不回滚
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值