配置事物:

@Configuration
/**强制使用cglib代理时就把proxy-target-class设为true.*/
@EnableTransactionManagement(proxyTargetClass=true)
public class DataBaseConfiguration implements TransactionManagementConfigurer{ @Bean(name="testpackageTransactionManager")
@Qualifier("testpackageTransactionManager")
public PlatformTransactionManager testpackageTransactionManager() {
return new DataSourceTransactionManager(testpackageDataSource());
}
}

事物回滚错误示例:

示例一:

@Transactional(value = "testpackageTransactionManager", rollbackFor = RuntimeException.class)
@RequestMapping("/rollback")
public void rollback() {
try {
TestEntity test = new TestEntity();
test.setMark("======rollback tran test========");
testMapper.insertSelective(test);
throw new Exception("出错了========!");
} catch (Exception ex) {
System.out.println("出错了回滚事物");
}
}

被try catch处理的事物不会回滚。

下面的方法会成功回滚:

示例二:

手动回滚:

    @Transactional(value = "testpackageTransactionManager", rollbackFor = RuntimeException.class)
@RequestMapping("/rollback")
public void rollback() {
try {
TestEntity test = new TestEntity();
test.setMark("======rollback tran test========");
testMapper.insertSelective(test);
throw new Exception("出错了========!");
} catch (Exception ex) {
System.out.println("出错了回滚事物");
        //手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

示例三:

指定事物回滚rollbackFor = Exception.class ,抛出Exception、RuntimeException、DiyException(自定义继承自Exception的异常)异常都可以成功回滚

@Transactional(value = "testpackageTransactionManager", rollbackFor = Exception.class)
@RequestMapping("/testTran3")
public void testTran3() throws Exception {
try {
TestEntity test = new TestEntity();
test.setMark("======rollback tran test 2========");
testMapper.insertSelective(test); throw new Exception("出错了回滚事物==!");
} catch (Exception ex) {
System.out.println("出错了回滚事物");
throw new Exception("出错了回滚事物");
        //throw new RuntimeException("出错了回滚事物");
       //throw new DiyException(); 继承自Exception的自定义异常
} }

示例四:

指定事物回滚rollbackFor =RuntimeException.class  ,只有抛出RuntimeException类型的异常,才会回滚事物

    /**事物回滚成功*/
@Transactional(value = "testpackageTransactionManager", rollbackFor = RuntimeException.class)
@RequestMapping("/testTran4")
public void testTran4() throws Exception {
try {
TestEntity test = new TestEntity();
test.setMark("======rollback tran test 2========");
testMapper.insertSelective(test);
throw new Exception("出错了回滚事物==!");
} catch (Exception ex) {
System.out.println("出错了回滚事物");
throw new RuntimeException("出错了回滚事物");
}
}

  为什么【示例一】不会滚呢??是对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();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)。

Spring事务回滚的更多相关文章

  1. Spring事务回滚和异常类

    1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable.Error和RuntimeException及其子类成为未检查异常( ...

  2. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  3. spring事务回滚问题

    刚刚接到一个上家公司同事的一个电话,问我为什么service方法事务不会滚了,日志打印了,调用webservice报错. 我让他把这个调用执行webservice的方法截图发给我,如下:   publ ...

  4. Spring 事务回滚机制详解

    1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocat ...

  5. @Transactional spring事务回滚相关

    还可以设置回滚点,看下面 /** * 用户登录接口 * * * 1明确事务方法前的命名规则 * 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作 * 3不允许所有 ...

  6. spring 事务回滚

    1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: public method() { Dao1.save(Person1); Dao1.save( ...

  7. 关于Spring事务回滚的问题

    在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么 ...

  8. spring事务回滚无法捕捉

    这篇文章讲解了怎么配置才能让spring事务捕捉异常 http://www.360doc.com/content/12/1109/18/6161903_246870991.shtml 需要正确配置sp ...

  9. Spring 事务回滚代码

    在事务中实行的方法:org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransacti ...

随机推荐

  1. 自动交互式脚本--expect

    我们经常会遇到一些需要与服务器程序打交道的场景,比如,从登陆某个服务器,然后进行某项工作.这很平常,但是如果把这个工作自动化进行,你就需要一个程序能自动做你要告诉机器的事情,这样,我们的expect就 ...

  2. 【BZOJ3626】[LNOI2014]LCA 离线+树链剖分+线段树

    [BZOJ3626][LNOI2014]LCA Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度 ...

  3. Leetcode-Bianry Tree Maximum Path Sum

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  4. LeetCode 笔记系列11 First Missing Positive [为什么我们需要insight]

    题目: Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2 ...

  5. 事务以及MySQL事务隔离级别+MySQL引擎的区别

    1.事务的基本要素:ACID 1.原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  6. 使用Git分支开发新特性或修复Bug与使用Git分支开发新特性或修复Bug

    使用Git分支开发新特性或修复Bug 通过分支,可以在不影响原有代码的前提下改变代码,主要用于开发新功能新特性.下 一代产品 为已经发布的正式版修复bug 团队开发时为每个人建立一个分支,从而避免相互 ...

  7. Python使用函数实现把字符串转换成整数

    需求:假设Python没有提供内置函数int如果使用函数方式实现把一串字符串转换成整数例如把字符串‘12345‘转换成整数12345 思路 1,字符串也是序列可以使用map函数处理分割成一个列表 2, ...

  8. Hadoop伪分布安装详解(三)

    目录: 1.修改主机名和用户名 2.配置静态IP地址 3.配置SSH无密码连接 4.安装JDK1.7 5.配置Hadoop 6.安装Mysql 7.安装Hive 8.安装Hbase 9.安装Sqoop ...

  9. c# 项目文件,C#viual studio使用方法

    一.项目文件 1)Properties节点下主要存放的是当前程序集相关的信息,如版本号.标题等.双击”Properties“,打开如下项目属性窗口,可以设置项目相关的一些参数. 2)引用 节点主要列出 ...

  10. java面试基础题------》抽象类和接口有什么异同

    划重点!!!! 1.抽象类(abstract class)和接口(interface)有什么异同? 相同点 * 都不能被直接实例化,都可以通过继承实现其抽象方法. * 都是面向抽象编程的技术基础,实现 ...