Spring 事务声明无效果(转)
为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚。
例:  
   类似这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) :
- if(userSave){
 - try {
 - userDao.save(user);
 - userCapabilityQuotaDao.save(capabilityQuota);
 - } catch (Exception e) {
 - logger.info("能力开通接口,开户异常,异常信息:"+e);
 - }
 - }
 
下面的方法回滚(一个方法出错,另一个方法会回滚):
- if(userSave){
 - try {
 - userDao.save(user);
 - userCapabilityQuotaDao.save(capabilityQuota);
 - } catch (Exception e) {
 - logger.info("能力开通接口,开户异常,异常信息:"+e);
 - throw new RuntimeException();
 - }
 - }
 
或者:
- if(userSave){
 - try {
 - userDao.save(user);
 - userCapabilityQuotaDao.save(capabilityQuota);
 - } catch (Exception e) {
 - logger.info("能力开通接口,开户异常,异常信息:"+e);
 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 - }
 - }
 
为什么不会滚呢??是对spring的事务机制就不明白。!! 
   默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。  
   spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过  
    
配置来捕获特定的异常并回滚  
  换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚
  解决方案: 
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new
RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层
action)要继续捕获这个异常并处理
  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)
Spring 事务声明无效果(转)的更多相关文章
- spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
		
知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...
 - spring事务详解(基于注解和声明的两种实现方式)
		
Spring事务( Transaction ) 事务的概念 事务是一些sql语句的集合,作为一个整体执行,一起成功或者一起失败. 使用事务的时机 一个操作需要多天sql语句一起完成才能成功 程序中事务 ...
 - Spring事务方法上增加synchronized真的有效果吗?
		
此文转载,Spring事务本身是一个非常复制的问题,再加上线程并发处理就更加要主要了,由于再开发中有很多朋友会范与下文同样的错误,因分享给大家. 前言 Spring事务的一个奇怪的问题. 朋友问了我一 ...
 - Spring 事务管理高级应用难点剖析--转
		
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
 - 理解 spring 事务传播行为与数据隔离级别
		
事务,是为了保障逻辑处理的原子性.一致性.隔离性.永久性. 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据等等一系列的问题. 事务有两个重要特性: 事务的传播行为 数据隔离级别 1.事务传播行 ...
 - spring事务隔离级别、传播机制以及简单配置
		
转自 https://blog.csdn.net/zht741322694/article/details/78676964 一.spring支持的事务声明方式1. 编程式事务 当系统需要明确的, ...
 - 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
		
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
 - Spring事务管理(转)
		
1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...
 - 详解spring事务属性
		
Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try…catch…final ...
 
随机推荐
- 2018上半年DDoS攻击报告:流量峰值达1.7Tbps
			
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 2018年上半年DDoS攻防仍如火如荼发展,以IoT设备为反射点的SSDP反射放大尚未平息,Memcached DDoS又异军突起,以最高可 ...
 - HDU 1754——I Hate It——————【线段树单点替换、区间求最大值】
			
I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
 - 浅谈C#中HttpWebRequest与HttpWebResponse的使用方法
			
1.第一招,根据URL地址获取网页信息get方法 public static string GetUrltoHtml(string Url,string type) { try { System.Ne ...
 - .NET Core 部署到CentOS–1.创建项目,简单部署
			
开发环境:Windows 10,部署环境:阿里云 CentOS 7.3 1. 创建应用 1) 创建项目, 配置应用生成部署包 2) 配置项目 编辑project.json, 追加环境项, 选项可参考这 ...
 - C# tcp udp 串口 通信
			
简单的实现tcp同步和异步,udp,串口通信 static List<TcpClientState> clientArray = new List<TcpClientState> ...
 - PAT 1083 List Grades
			
#include <cstdio> #include <cstdlib> using namespace std; class Stu { public: ]; ]; }; i ...
 - SQL:exec sp_executesql 用法
			
--這種是無效的過程 declare @sql nvarchar(500), @where nvarchar(500),@i nvarchar(64),@p nvarchar(50),@id int ...
 - 机器学习(一)——K-近邻(KNN)算法
			
最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习. 一 . K-近邻算法(KNN)概述 最简单最初级的 ...
 - JavaScript性能优化小知识总结(转)
			
JavaScript的性能问题不容小觑,这就需要我们开发人员在编写JavaScript程序时多注意一些细节,本文非常详细的介绍了一下JavaScript性能优化方面的知识点,绝对是干货. 前言 一直在 ...
 - js:JSON对象与JSON字符串转换
			
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式. 同时,JSON是 JavaScript 原生格式,这 ...