spring中什么情况下事务会失效?

薄洪涛2年前JAVA8559

事务失效的场景?

  1. 权限问题,@Transactional 修饰的方法必须为public

  2. 方法用final修饰或者是static方法spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而无法添加事务功能。

  3. 方法内部调用 如果在某个Service类的某个方法中,调用另外一个事务方法,即在同一个类中的方法直接内部调用,事务会失效。m1中通过this的方式调用了m2方法,而this并不是代理对象,this.m2()不会被事务拦截器,所以事务是无效的

	@Component
	public class UserService {
	    public void m1(){
	        this.m2();
	    }
	    
	    @Transactional
	    public void m2(){
	        //执行db操作
	    }
	}

如果外部直接调用通过UserService这个bean来调用m2方法,事务是有效的,上面代码可以做一下调整,如下,在UserService中注入了自己(或者在该Service类中使用AopContext.currentProxy()获取代理对象),此时m1中的m2事务是生效的

@Component
public class UserService {
    @Autowired //这里注入了自己
    private UserService userService;

    public void m1() {
        this.userService.m2();
    }

    @Transactional
    public void m2() {
        //执行db操作
    }
}
  1. 未被spring容器管理 使用spring事务的前提是:对象要被spring管理,需要创建bean实例。通常情况下,我们通过@Controller、@Service、@Component、@Repository等注解,可以自动实现bean实例化和依赖注入的功能。如果类未被 Spring 管理,事务自然就失效了。

  2. 多线程调用 spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接。我们说的同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样的,所以是不同的事务

  3. 异常情况 默认情况下,RuntimeException和Error的情况下,spring事务才会回滚。
    通过try catch把异常捕获到处理了也不会回滚。


标签: JAVA事务

相关文章

Springboot+Kotlin的搭建

Springboot+Kotlin的搭建

不少公司觉得php的性能较低,于是采用java做逻辑处理,php做表现层的做法,个人觉得对于业务量比较复杂,安全性要求较高的项目,可以采用此类做法;于是我学着搭建了一个基于spring boot的接口...

idea 部署Tomcat服务器

idea 部署Tomcat服务器

一、创建一个web项目1.file-new project,选择正确的jdk版本后(没配置的可以先自行google配置),next2.next3.输入项目名字和路径二,创建Module1.鼠标点中项目...

java相关日期函数

java相关日期函数

JDK7Data// 1.创建当前时间 Date d1 = new Date(); System.out.println(d1); // ...

RabbitMq交换机类型

RabbitMq交换机类型

direct路由键和队列名完全匹配,才可以消费如果绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列fanout还有一种不需要key的,...

spring AOP概念及应用场景

spring AOP概念及应用场景

概念面向切面编程,通过预编译和运行期间动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术思想就是把很多类中对象中横切问题点,从业务逻辑中分离出来,达到解耦的目的,增加代码的重用性,提高开发...

spring循环依赖

spring循环依赖

什么是循环依赖? 很简单,就是A对象依赖了B对象,B对象依赖了A对象在Spring中,⼀个对象并不是简单new出来了,⽽是会经过⼀系列的Bean的⽣命周期,就是因为 Bean的⽣命周期所以才会出现循环...

评论列表

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。