首页 > 其他分享 >同一个类中@Transactional 事务失效

同一个类中@Transactional 事务失效

时间:2023-06-01 10:37:19浏览次数:28  
标签:事务 调用 Transactional void 失效 方法 public 类中

1.在同一个类中一个没有事务 A 的方法调用另个有事务 B 的方法,那么那个有事务 B 的方法是失效的;

public class test {    
	public void a() { 
        this.b();
    }

    @Transactional
    public void b() {
        /* … */
    }
}

2.如果有事务 A 方法调用没有(或者有)事务 B 的方法,那么事务 A 都会生效,而方法 B 不会生效;

public class test {    
    @Transactional    
    public void a() {         
        this.b();
    }

    @Transactional
    // @Transactional
    public void b() {
        /* … */
    }
}

3.但是如果是不同类的话就都会生效;

总结 

我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。简单来说,内部调用本类方法,不会再走代理了,所以B的事务不起作用。

解决方案:

  1. 可以将方法放入另一个类,并且该类通过spring注入,即符合了在对象之间调用的条件。
  2. 获取本对象的代理对象,再进行调用。具体操作如:

1)Spring-content.xml上下文中,增加配置:

2)在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活事务切面。

public class test {    
    @Transactional    
    public void a() {
    	(test)(AopContext.currentProxy()).b();    
    }    
    @Transactional
    public void b() {
        /* … */
    }
}

  1. 当然也可以@Autowired 注入自己来调用方法解决。
  2. 把注解加到类名上面。

 

标签:事务,调用,Transactional,void,失效,方法,public,类中
From: https://blog.51cto.com/u_16111396/6392690

相关文章

  • windows复制粘贴功能失效的解决方案
    解决方案:1、如果远程复制正在进行,先使用任务管理器,强制结束:将任务管理器面板切换到进程,找到rdpclip.exe,选中它,然后点击结束进程。(电脑主要依赖该进程进行粘贴) 2、键盘上按Win+R组合键,弹出“运行”窗口,输入rdpclip.exe,按回车,重新启动复制粘贴功能 3、启动成功后,就可以正常......
  • 记一次spring 事务失效的解决
    我们项目既有使用springJPA也有使用springJdbcTemplate,此次事务失效的原因是,项目之前配置的是springjpa的专门的事务管理器。第一次尝试解决:添加springJdbcTemplate的事务管理器,并添加相应的注解驱动。不生效!!!第二次尝试解决:问了下chartgpt,如果在Spring配置文件中启用了多......
  • @Transactional基本概念和失效情况
    一、事务......
  • 权限控制,美化admin,签发token逻辑,放在序列化类中写
    1权限控制#ACL(访问控制列表)的权限控制:(针对互联网用户的产品) 用户表idnamepassword1zhangsan123权限表iduser_id权限11评论权限21发抖音权限张三:[评论权限,发抖音权限]#R......
  • sudo命令下环境变量失效的解决方法
    环境Ubuntu20.04原因在sudo命令时,系统会默认重置环境变量为安全的环境变量,即之前设置的变量都会失效sudosed'/^#/d;/^$/d'/etc/sudoersDefaultsenv_reset表示默认会重置环境变量secure_path当使用sudo命令时,自定义的环境变量PATH将失效,系统只识别该行定义的环境变量......
  • resetFields失效与$nextTick
     这个问题会比较常见。我们经常会遇见这么写:update和add共用一个弹窗。update时,表单回显;add时,需要清空表单。  我们可能会用到Element-Ui表单的resetFields()方法,但是如果操作不当,这个resetFields()方法并不会生效。官网对这个方法的定义:resetFields: 对整个表单进行......
  • 分组,捕获,反向引用以及String类中使用
    1. 提出要求  896请看下面问题:给你一段文本请你找出所有四个数字连在一 起的子串,并且这四个数字要满足①第1位与第4位相同②第2位与第3位相同,比如1221,5775,……2. 介绍  896要解决前面的问题,我们需要了解正则表达式的几个概念:1. 分组我们可以用圆括号组成一个比较复杂的匹......
  • Spring事务失效的场景
    (1)方法没有用public修饰会导致事务失效。解决方法:在方法上使用public修饰。(2)使用try-catch捕获异常没有抛出异常,而是由方法自己处理会导致事务失效。解决方法:处理了异常记得抛出。(3)方法抛出检查异常会导致事务失效,报错也会导致事务失效。解决方法:在@transactional注解上配置ro......
  • matlab中find函数失效的问题
    (52条消息)关于matlab中find函数失效的问题_matlabfind有时候找不到值_开飞机的小毛驴儿的博客-CSDN博客matlab中的find函数可以返回指定元素的位置,但是有时候会发现矩阵中明明存在一个数,但是返回位置却是空的,即找不到指定元素的位置。这时候需要考虑的是matlab的精度问题。如......
  • 使用SpringMVC 拦截器导致出现@CrossOrigin失效问题解决办法
    非简单请求会发起一个OPTIONS方法的预检请求,这个请求会被拦截器拦截,但是服务器没有给浏览器返回必要的跨域指示信息(比如:“Access-Control-Allow-Origin”----允许哪些请求访问),浏览器没收到指示信息,就认为服务器不允许跨域请求,就会报错。所以需要在拦截器拦截OPTIONS方法的预......