转.Spring手动回滚事务

throw new RuntimeException();

或者  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

为什么不会滚呢??是对spring的事务机制就不明白。!!

默认spring 事务只在发生未被捕获的 RuntimeExcetpion时才回滚。  
Spring Aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样Aop代理才能捕获到方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeExcetpion的异常,但可以通过 配置来捕获特定的异常并回滚换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeExcetpion(),这样程序异常时才能被Aop捕获进而回滚

解决方案: 
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeExcetpion()语句,以便让Aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)。

时间: 2024-11-04 17:16:12

转.Spring手动回滚事务的相关文章

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务

Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback:如果发生的异常是checked异常,默认情况下数据库操作还是会提交的. checked异常: 表示无效,不是程序中可以预测的.比如无效的用户输入,文件不存在,网络或者数据库链接错误.这些都是外在的原因,都不是程序内部可以控制的.必须在代码中显式地处理.比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层. 阿里编码规约示

AOP实现LCN手动回滚事务

许多用LCN作为分布式事务解决方案的同学可能会遇到一个问题.当分布式事务中的子事务自己try catch了异常的时候,异常并没有抛出来,而不抛出异常,则LCN不会执行回滚操作 这种情况其实挺常见的,比如:一个订单系统,在下单的时候可能会涉及到优惠券.积分.权益的使用,而如果优惠券.积分.权益分别由不同开发人员开发,他们各自有自己的开发习惯,其中一个人就习惯自己处理异常,然后返回一个错误码,又或者有些公司的代码规则是需要自己处理异常的.这种情况,就不能依靠异常来让LCN回滚事务. 那这时候怎么办呢

Spring手动绑定ConfigurationProperties

Spring加载ConfigurationProperties的典型应用是自动加载(Autowired),在一些特殊的场景需要手动修改加载的Property属性. 代码实例,config类 import java.util.ArrayList; import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(pre

关于项目中遇到的问题-- trycatch 手动回滚事务

try catch 捕捉事务 是不回滚的,但是又想返回自己处理的异常,又回滚事务该怎么办呢. 答案:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); # 手动回滚异常 如下: 自己捕获处理异常 ,以及并回滚事务. 原文地址:https://www.cnblogs.com/yunliu0603/p/10960532.html

使用spring手动获取Bean的时候,不能强转回它自己。

这个问题好像有点长,描述一下: 就是通过类名的方式获取Bean后,得到一个Object对象,但是这个Object不能再强转回Bean了.抛出的异常时类型转换异常.  java.lang.ClassCastException 还有一个现象就是,本来自己对类进行注解了,但是用类名获取的时候,获取不到,抛出的异常时找不到类. org.springframework.beans.factory.NoSuchBeanDefinitionException 还有一个是 java.lang.AbstractM

spring 手动写事物,案例

原文地址:https://www.cnblogs.com/gzhbk/p/12662458.html

关于Spring事务回滚的问题

在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么条记录: [html] view plain copy print? <bean id="dataSource" class="xxx"> <property name="xxx" value="xxx"/>

spring 事务回滚

1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中 Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据

spring管理事务回滚

spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: ? 1 2 3 4 5 6 7 public method() {   Dao1.save(Person1);   Dao1.save(Person2);   Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中   Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正常情