时间:2021-05-19
一、声明式
这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:
<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"/> <!-- 定义所有get开头的方法都是只读的 --> <tx:method name="get*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 定义AOP配置 --> <aop:config> <!-- 定义一个切入点 --> <aop:pointcut expression="execution (* com.test.services.impl.*.*(..))" id="services"/> <!-- 对切入点和事务的通知,进行适配 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/> </aop:config>二、注解式
这种方法,只需要在Spring配置文件中定义一个事务管理对象(如DataSourceTransactionManager),然后加入<tx:annotation-driven/>节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用@Transactional进行标注。示例如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 声明使用注解式事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>三、<tx:annotation-driven/>
Spring提供的<tx:annotation-driven/>用于开启对注解事务管理的支持,从而能识别Bean类上的@Transactional注解元数据,其具有以下属性:
1、<tx:annotation-driven/>
transaction-manager:指定事务管理器名字,默认为transactionManager,当使用其他名字时需要明确指定;
proxy-target-class:表示将使用的代码机制,默认false表示使用JDK代理,如果为true将使用CGLIB代理
order:定义事务通知顺序,默认Ordered.LOWEST_PRECEDENCE,表示将顺序决定权交给AOP来处理。
2、@Transaction
Spring使用@Transaction来指定事务属性,可以在接口、类或方法上指定,如果类和方法上都指定了@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属性语义完全一样;
Spring提供的@Transaction注解事务管理内部同样利用环绕通知TransactionInterceptor实现事务的开启及关闭。
使用@Transactional注解事务管理需要特别注意以下几点:
如果在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口;
建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用,这是因为如果使用JDK代理机制是没问题,因为其使用基于接口的代理;而使用使用CGLIB代理机制时就会遇到问题,因为其使用基于类的代理而不是接口,这是因为接口上的@Transactional注解是“不能继承的”;
在Spring代理机制下(不管是JDK动态代理还是CGLIB代理),“自我调用”同样不会应用相应的事务属性,其语义和<tx:tags>中一样;
默认只对RuntimeException异常回滚;
在使用Spring代理时,默认只有在public可见度的方法的@Transactional 注解才是有效的,其它可见度(protected、private、包可见)的方法上即使有@Transactional 注解也不会应用这些事务属性的,Spring也不会报错,如果你非要使用非公共方法注解事务管理的话,可考虑使用AspectJ。
以上这篇浅谈Spring的两种事务定义方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
编程式事务在Spring中事务管理的方式有两种,编程式事务和声明式事务。先详细介绍一下两种事务的实现方式.配置类@Configuration@EnableTra
Spring事务管理Spring支持两种方式的事务管理:编程式事务管理:通过TransactionTemplate手动管理事务,实际应用中很少使用,使用XML配
Spring对事务的支持有两种方式,一是自己编写事务,精确控制事务的边界,二是采用声明事务的方式,使用AOP来完成。无论哪种方式,我们都将使用一个Spring事
前言spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注
自动注入和@Autowire@Autowire不属于自动注入!注入方式(重要)在Spring官网上(文档),定义了在Spring中的注入方式一共有两种:set方