配置事物:

@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. jquery表单验证插件 jquery.form.js ------转载

    Form插件,支持Ajax,支持Ajax文件上传,功能强大,基本满足日常应用. 1.JQuery框架软件包下载 文件: jquery.rar 大小: 29KB 下载: 下载 2.Form插件下载 文件 ...

  2. 【BZOJ3416】Poi2013 Take-out 栈

    [BZOJ3416]Poi2013 Take-out Description 小F喜欢玩一个消除游戏——take-out 保证k+1|n,保证输入数据有解这是一个单人游戏 游戏者的目标是消除初始时给定 ...

  3. poj1179 Polygon【区间DP】

    Polygon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:6633   Accepted: 2834 Descriptio ...

  4. 解决SecureCRT连接linux终端中文显示乱码

    现象如下: 原因: SecureCRT的字符集编码不是Linux的默认编码:UTF-8 解决办法: 1.在“选项”找到“会话选项” 2.选择“外观”,设置字符编码为“UTF-8” 3.确定后,继续在终 ...

  5. Exchange Management Console Error

    Exchange 2010 error solved : The WS-Management service cannot process the request. The system load q ...

  6. Linux 常用资源

    kernel:ftp://kernel.orgcnkernel:http://www.cnkernel.orgoldlinux:http://www.oldlinux.orgminix3:http:/ ...

  7. 删除Android自带的系统软件注意事项

      教程类 知识分享 [转]好多童鞋在ROOT手机后,大刀阔斧的就开始砍系统里面的东西,有些事删不得的,删除错了就成砖头了! 以下是对照表: 注意:打*号的千万别删,打-号的是建议删的(大多要穿墙才能 ...

  8. centos 7.5 最小化安装

    参考:https://www.tecmint.com/centos-7-installation/ ================================================== ...

  9. 多线程入门-第五章-线程的调度与控制之yield

    yield与sleep类似,只是不能指定暂停多长时间,并且只能让同优先级的线程有执行的机会,让位时间不固定. /* yield使用 */ public class ThreadTest04 { pub ...

  10. php+nginx上传文件配置