一、简介

  Spring事务配置及相关说明详见:https://www.cnblogs.com/eric-fang/p/11052304.html。这里说明spring事务的几点注意:

  1、默认只会检查回滚RuntimeException的异常。

  2、@Transactional注解只能作用于public的方法上,默认传播行为 Propagation.REQUIRED

  3、service内部方法之间的调用,不会被spring拦截到,也即不会产生事务

二、坑点

  主要的坑点就是在嵌套事务上,当service内部方法之间调用的时候,很可能会产生预期之外的效果。例如下例子:

    saveUser保存用户,如果过程出现异常,则执行saveMsg方法。

public class UserServiceImpl implements UserService{

	@Autowired
private UserDao userDao;
@Autowired
private MsgDao msgDao;
@Autowired
private MsgService msgService;
@Autowired
private UserService userService; @Transactional(propagation = Propagation.REQUIRED)
public void saveUser(User user) throws Exception {
System.out.println(user.toString());
try {
userDao.saveUser(user);
int i = 1/0;
// saveUser2(user);
} catch (Exception e) {
// msgService.saveMsg();
// this.saveMsg();
userService.saveMsg();
throw new RuntimeException();
}
} @Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveMsg() {
TbMsg msg = TbMsg.builder().name("xiaocao").msg("xiaoxiao").age(27).build();
msgDao.saveMsg(msg);
}
}

  单元测试,调用saveUser方法,并没有达到想要的效果(saveUser异常,SaveMsg隔离级别是REQUIRES_NEW,理论上应该能入库)。

  失败原因即是上面第一节中说的:同一个service中的方法调用,不会产生新事务。Spring 事务的管理控制,主要是通过AOP的动态代理增强来实现的,目标对象本身并没有任何的事务管理能力,都是通过代理对象动态增强功能去实现事务管理。在同一个service中的方法调用,相当于是目标对象本身的this调用,并没有经过代理对象,所以自然的事务配置的嵌套均无效。

  解决策略:

  1、saveMsg移动到另一个service中,在UserServiceImpl中导入MsgService,saveUser中通过MsgService类去调用。

  2、UserServiceImpl中注入自己,通过注入的自身service进行调用。

Spring事务传播行为中可能的坑点的更多相关文章

  1. required_new spring事务传播行为无效碰到的坑!

    在测试事务传播行为的时候,因为用了同一个service中的方法测试,所以不管怎么设置都无效了: 原因是aop动态代理只会拦截一次执行方法,第二个方法是照搬的,只要调用其他service中的事务方法,传 ...

  2. 阿里大牛带你深入分析spring事务传播行为

    spring框架封装了很多有用的功能和组件,便于在项目开发中快速高效的调用,其中spring的事务使用非常简单,只需要在用到事务的地方加一行注解即可: 1@Transactional 但越是看起来简单 ...

  3. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  4. Spring事务传播机制

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...

  5. Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

    Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这 ...

  6. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  7. spring 事务传播机制

    spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...

  8. 事务、事务特性、事务隔离级别、spring事务传播特性

    事务.事务特性.事务隔离级别.spring事务传播特性   1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...

  9. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

随机推荐

  1. FIS 插件机制

    FIS 插件机制 author: @TiffanysBear 当我们使用 FIS 插件的时候,有没有想过自己也开发一个基于 FIS 的插件,参与 FIS 打包编译的整个流程:那么问题就来了: FIS ...

  2. 域渗透-LSA Protection

    简介: 微软在 2014 年 3 月 12 日添加了 LSA 保护策略,用来防止对进程 lsass.exe 的代码注入,这样一来就无法使用 mimikatz 对 lsass.exe 进行注入,相关操作 ...

  3. px和dp(内含大量的像素单位详解)

    1.前言: 读完本文你会学到什么: dp(device pixels) px(css pixels) pt(point) ppi(pixels per inch) dpi(dots per inch) ...

  4. vue实现对语言的切换,结合vue-il8n。

    1.安装vue-i18n: npm install vue-i18n 如果npm长时间无反应,或安装失败,可以换成淘宝镜像安装: cnpm install vue-i18n 2.在main.js中引用 ...

  5. Mybatis关联查询<association> 和 <collection>

    一.背景 1.在系统中一个用户存在多个角色,那么如何在查询用户的信息时同时把他的角色信息查询出来啦? 2.用户pojo: public class SysUser { private Long id; ...

  6. ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (60000, 28, 28)

    报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/3.Keras/3.构建各种神经网络/3.CNN ...

  7. [python]打开文件操作open用法

    1. 格式 handle = open(file_name, access_mode = 'r') file_name: 希望打开的文件名 access_mode: 'r'表示读取,'w'表示写入,' ...

  8. 2019 HZNU Winter Training Day 13 Comprehensive Training

    A.Jongmah   CodeForces-1110D 题意:你在玩一个数字游戏,有一堆写在瓦片上的数字,希望你能组成最多的三元组(三个数字相同,或顺子). 这题用到的方法是动态规划.f[i][j] ...

  9. lightoj 1046 - Rider(bfs)

    A rider is a fantasy chess piece that can jump like a knight several times in a single move. A rider ...

  10. window对象,BOM,window事件,延时器,DOM

    01.定时器补充 function fn(){    console.log(1);}setInterval("fn()",100);  //定时器调用匿名函数/*   funct ...