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

    xiaoxiao2023-10-30  160

    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    是        与事务属性关联的方法名。 propagation    不    REQUIRED    事务传播行为 isolation    不    DEFAULT    事务隔离级别 timeout    不    -1    事务超时时间,以秒为单位 readonly    不    false    事务是否只读 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-manager    transactionManager    使用的事务管理器的名字。 mode    proxy    默认的模式“proxy”会用Spring的AOP框架来代理注解过的bean;另一种可行的模式“aspectj”会使用Spring的AspectJ事务切面来编织类 proxy-target-class    false    只对代理模式有效。决定为那些使用了@Transactional注解的类创建何种事务代理。 如果 “proxy-target-class” 属性被设为 “true”, 那么基于类的代理就会被创建。如果 “proxy-target-class”属性被设为”false” 或者没设,那么基于接口的标准JDK代理就会被创建。 order    Ordered.LOWEST_PRECEDENCE    定义事务通知的顺序会作用到使用@Transactional注解的bean上 @Transactional注解的属性

    属性    类型    描述 propagation    枚举型:Propagation    可选的传播性设置 isolation    枚举型:isolation    可选的隔离性级别(默认值:ISOLATION_DEFAULT) readOnly    布尔型    读写型事务 vs. 只读型事务 timeout    int型(秒为单位)    事务超时 rollbackFor    一组 Class 类的实例,必须是Throwable 的子类    一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚 rollbackForClassname    一组 Class 类的名字,必须是Throwable的子类    一组异常类名,遇到时必须进行回滚 noRollbackFor    一组 Class 类的名字,必须是Throwable的子类    一组异常类名,遇到时必须不回滚 noRollbackForClassname    一组 Class 类的名字,必须是Throwable的子类    一组异常类名,遇到时必须不回滚 ---------------------  作者:老杂  来源:  原文:https://blog.csdn.net/u012744159/article/details/50847369  版权声明:本文为博主原创文章,转载请附上博文链接!

    最新回复(0)