Transaction 事务回滚无效,常见原因!!!

梦想与她 提交于 2020-03-03 05:28:54

 

今天使用@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个容器的对象管理最好做下区分

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!