原文链接: http://www.cnblogs.com/sweetchildomine/p/6978037.html?utm_source=itdadao&utm_medium=referral

补充推荐:https://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method

     http://blog.csdn.net/gudejundd/article/details/54380141

对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,SpringAOP,就切入不了

当然可以使用原生ASPECTJ,不用SpringAOP,但是基于生态链问题,还是尽量使用SpringAOP

这里简单说一下,Spring如何选择使用CGLIB,或者是JDK代理,

Spring 代理对象,cglib,jdk的问题思考,AOP 配置注解拦截 的一些问题.为什么不要注解在接口,以及抽象方法.

简单来说,如果实现了某个接口,那么Spring就选择JDK代理(不一定),如果没有,那么就选择CGLIB代理,说起来简单,Spring还会闹脾气,不代理呢

点击:根据Spring代理对象获得真实对象

一直以来比较多的情况是在Controller 调用Service 的方法,把事务直接在Service的方法上,妥妥的没问题,事务正常执行

考虑以下问题: 同对象的方法B 调用自己的方法A,这里的事务将会失效(严格上来说,只要对方法A使用注解AOP均会失效),原因是因为这里的this.调用的并不是Spring的代理对象

@Service
public class ClassA{ @Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA(){ } /**
* 这里调用methodA() 的事务将会失效
*/
public void methodB(){
this.methodA();
} }

最简单的解决方法为:(代理模式为JDK 的情况下(根据接口代理))

 @Service
public class ClassA extends BaseClass{ @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
public void methodA(){ } /**
* 这里调用methodA() 的事务将会失效
*/
    
public void methodB(){
        //使用getBean
    ((BaseClass)SpringUtil.getBean("classA")).methodA();
} }

 第二种方式:

解决第一步: 必须

SpringBoot:注解开启cglib代理,开启 exposeProxy = true,暴露代理对象 (否则AopContext.currentProxy()) 会抛出异常

@EnableAspectJAutoProxy(exposeProxy = true)
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

配置方式:配置方式下,我用的是SpringBoot 1.5.4没有找到exposeProxy的选项,所以建议使用注解式.

传统Spring配置文件

XML

<aop:aspectj-autoproxy expose-proxy="true"/>

第二步(需要保证Spring对这个bean创建了代理对象,基本上涉及到Aop的方法的类,都会创建代理对象) 可以用以下代码判断

/**
* Created by laizhenwei on 19:37 2017-10-14
*/
@Service("classImplProxy")
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public class ClassImplProxy implements IClass { @Override
@Transactional
public void sysout() {
} //是否代理对象
@Override
public boolean isAopProxy() {
return AopUtils.isAopProxy(AopContext.currentProxy());
} //是否cglib 代理对象
@Override
public boolean isCglibProxy() {
return AopUtils.isCglibProxy(AopContext.currentProxy());
} //是否jdk动态代理
@Override
public boolean isJdkDynamicProxy() {
return AopUtils.isJdkDynamicProxy(AopContext.currentProxy());
}
}

获取代理对象

  @Service
public class ClassA{ @Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA(){ } /**
* 这里调用methodA() 的事务将会失效
*/
public void methodB(){
//手动获取此对象Spring的代理类
((ClassA)AopContext.currentProxy()).methodA();
} }

第三种方式

直接在当前类@Autowire 或者@Resource 注入自己,然后用注入的bean 调用方法

@Transactional spring 事务(转载)的更多相关文章

  1. @Transactional spring 事务失效(转载)

    原文地址:http://hwak.iteye.com/blog/1611970 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和 ...

  2. @Transactional spring事务无效的解决方案

    关于@Transactional注解 一般都认为要注意以下三点 1 .在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方法.类定义 ...

  3. @Transactional spring事务回滚相关

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

  4. 死磕Spring之AOP篇 - Spring 事务详解

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  5. spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)

    原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...

  6. spring 事务-使用@Transactional 注解(事务隔离级别)

    转: spring 事务-使用@Transactional 注解(事务隔离级别) 2016年08月11日 21:49:20 华华鱼 阅读数 15490 标签: spring事务Transactiona ...

  7. spring事务——try{...}catch{...}中事务不回滚的几种处理方式(转载)

    转载自   spring事务——try{...}catch{...}中事务不回滚的几种处理方式   当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @Respon ...

  8. Spring事务配置的五种方式(转载)

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  9. Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题

    最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...

随机推荐

  1. day5-基础 函数

     函数 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序 ...

  2. PHP处理Excel

    今天一个朋友问我PHP怎么导出Excel,然后我就去网上搜刮了一下资料,发现不错的第三方类PHPExcel(可以导入导出)和PHP-ExcelReader(导入).那就给大家分享一下! 一.PHP导入 ...

  3. 【luogu P2298 Mzc和男家丁的游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2298 对于迷宫问题,bfs是比较好的选择. 直接bfs模板 #include <iostream> ...

  4. sqlServer2014安装说明(windows7 64位)

    SqlServer2014安装说明(windows7 64位) 地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=42299 1, ...

  5. 02-第一个iOS程序-开发步骤

    打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也 ...

  6. boost::shared_ptr文档翻译

    shared_ptr: 共享所有权 原文链接 描述 模版类 shared_ptr 存储动态构造对象的指针,通常是由C++ new语句完成的.这个对象指针在最后一个持有指针所有权的shared_ptr被 ...

  7. 【TOJ 3305】Hero In Maze II

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^.突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫,开 ...

  8. 关于java dom解析的问题

    如下的xml代码: <persons> <person> <name>小强</name> <sex>male</sex> < ...

  9. 因为之前完全没有接触过Spring,所以准备先把spring实战看完再落实项目

    因为之前完全没有接触过Spring,所以准备先把spring实战看完再落实项目

  10. 云监控自定义HTTP状态码说明

    您在使用站点监控时,返回的6XX状态码均为云监控自定义HTTP状态码,具体含义如下表所示: 状态码      含义     备注  610  HTTP连接超时      监测点探测您的网站时出现连接超 ...