今天使用@Transcation注解的形式为serivce服务添加事物,但是无论如何都无法回滚!
在网上找了很多帖子,自己总结了一下.
开始说事务之前,不得不提一下java的异常类型:
分为checked异常和unchecked异常
checked异常:非系统原因造成的异常,比如需要Try - catch处理,或者throws抛出到上一层去,继承自java.lang.Exception(不包括java.lang.RuntimeException)
unchecked异常:系统原因自己造成的异常,如空指针异常,类型转换异常等,不需要在系统中显示的捕获处理。继承自java.lang.RuntimeException
下面是注解形式的事物在Spring中的配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class = "true" />
@Transaction(propagation=Propagation.NOT_SUPPORTED)
Propagation支持7种不同的传播机制:
REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
REQUIRESNEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。
事物无效的原因:
1.@Transactional 注解必须作用在public的权限管理上,其余的权限管理关键字并不会使事物生效
2.<tx:annotation-driven transaction-manager="transactionManager" /> 如果缺少了这一块配置 那么事物的注解也会失效
3.通过元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用。
如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
4.Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上.
在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效(即配合proxy-target-class为true)
5.@Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
6.在web项目中往往都会配置spring容器与spring-mvc子容器,所以想让事物在service中生效必须要区分2个容器的扫描对象,mvc就针对controller层扫描,其余的交给spring去控制
如果在mvc扫描所有的对象包括serivce,那么事物也会失效,所以2个容器的对象管理最好做下区分
来源:https://www.cnblogs.com/culushitai/p/9205036.html