最近在做事务添加时  发现自己的事务没有新建,上网查到   仅用作收藏。

其二  注意  事务的注解  应该在 内层的事务上面

一、描述
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时,
内层Service的方法被调用时,外层方法的事务被挂起;
内层事务相对于外层事务是完全独立的,有独立的隔离性等等。

二、实验
但实验时却遇到一个奇怪的问题:
1、当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。
2、当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚。

三、演示代码
XXXService中,有下面两个方法:
@Transactional 
method_One() {
    method_Two();
}

@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}

四、分析和结论
1、method_Two()会不会创建一个新事务? 
答:不会创建。仔细查看了日志,没有找到类似creating new transaction的输出,应该是因为在同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。 
那么为什么spring只对跨Service的方法才生效? 
Debug代码发现跨Service调用方法时,都会经过org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有经过此处,才能对事务进行控制。

2、不同的Service调用方法时:
如果被调用方法是Propagation.REQUIRES_NEW,被catch后不抛出,事务可以正常提交; 
如果被调用方法是Propagation.REQUIRED,被catch后不抛出,后面的代码虽然可以执行下去,但最终还是会分出rollback-only异常;

3、同一个Service中调用方法时:
不论注解是Propagation.REQUIRES_NEW 还是 Propagation.REQUIRED,
其结果都是一样的,就是都被忽略掉了,等于没写。
当其抛出异常时,只需catch住不抛出,事务就可以正常提交。

参考 http://blog.csdn.NET/chs_jdmdr/article/details/46411879

添加PROPAGATION_REQUIRES_NEW 事务没有产生作用的更多相关文章

  1. (转)添加PROPAGATION_REQUIRES_NEW 事务没有产生作用

    最近在做事务添加时  发现自己的事务没有新建,上网查到   仅用作收藏. 其二  注意  事务的注解  应该在 内层的事务上面 一.描述 Spring遇到嵌套事务时,当被嵌套的事务被定义为" ...

  2. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  3. Spring中事务配置以及事务不起作用可能出现的问题

    前言:在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上减少了开发的难度,本文介绍Spring事务配置的两种方式:基于配置文件的方式和基于注解 ...

  4. SpringBoot 内部方法调用,事务不起作用的原因及解决办法

    在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...

  5. @Transactional事务不起作用原因

    想必也有人遇到@Transactional事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的@Transactional事务起作用而自己的事务却没有起作用.如下举例子说 ...

  6. Spring事务不起作用原因

    首先声明: Checked异常继承java.lang.Exception类.Unchecked异常继承自java.lang.RuntimeException类. 而,Spring的事务实现采用基于AO ...

  7. @Transactional注解事务不起作用

    @Transactional注解事务不起作用 问题:今天在项目中碰到一个事务问题,使用@Transactional注解事务,抛出异常不会滚. 解决一:https://blog.csdn.net/u01 ...

  8. 在使用springMVC时,我使用了@Service这样的注解,发现使用注解@Transactional声明的事务不起作用

    问题出现的场景: 在使用spring mvc时,我使用了@Service这样的注解, 发现使用注解@Transactional声明的事务不起作用. 我的配置如下: <mvc:annotation ...

  9. [Java][Spring]Spring事务不起作用 问题汇总

    [Java][Spring]Spring事务不起作用 问题汇总 http://blog.csdn.net/szwangdf/article/details/41516239

随机推荐

  1. exe所在路径

    procedure TForm1.btn1Click(Sender: TObject); begin //完整路径 E:\UsrSoft\Desktop\FileNameDemo\Project1.e ...

  2. python 做接口自动化测试框架设计

    1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...

  3. Myeclipse和idea对比

    新入的公司要用myeclipse,没办法,只能跟着队伍走.(myeclipse以下简写为me) 1.myeclipse的快捷键并不能设置鼠标滚轮之类的,之前在idea上配置滚轮下滚展开package, ...

  4. react生命周期-新增与替换

    class A extends React.Component { // 用于初始化 state constructor() {} // 用于替换 `componentWillReceiveProps ...

  5. go学习笔记-简述

    1.程序结构 Go程序结构和C系程序(C/C++/JAVA等)一致,基本语句被组织成函数用于隔离和复用,函数组成源文件和包.Go程序存储在一个或多个.go文件中,每个文件都已pakage开头,表面当前 ...

  6. 15、TypeScript-函数

    1.参数和返回值可以指定类型 2.可选参数:在参数上加上?,表示可选的,可传可不传 3.默认参数:如果你不传参数,默认为20,如果你传参,就是你传的参数 4.剩余参数:会把传进来的实参变成一个数组,可 ...

  7. 7、TypeScript数据类型

    1.变量声明 var 不要使用 建议使用: let 变量 const 常量,一旦申明不能修改 2.数据类型 2.1布尔值:boolean 2.2数字类型  :number 2.3字符串类型:strin ...

  8. mybatis的配置与使用

    mybatis的配置与使用 一.全局配置文件配置 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties ...

  9. mock js使用方法简单记录

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. CSS3绘制特殊图形