不同类加事务方法的调用
时间: 2023-08-09 07:11:34 浏览: 50
不同类之间调用事务方法需要借助于事务管理器来保证事务的一致性。一般情况下,我们使用Spring框架来管理事务。在Spring中,我们可以将事务的管理交给Spring容器来处理,具体的实现方式为在Spring配置文件中配置事务管理器。然后我们在需要实现事务的方法上使用@Transactional注解,这样当该方法被调用时,Spring会自动开启事务,并在方法执行结束后提交或回滚事务。当我们需要在不同类中调用事务方法时,只需要在需要调用事务方法的类中注入事务管理器,然后直接调用带有@Transactional注解的事务方法即可。
相关问题
事务方法调用非事务方法
当事务方法调用非事务方法时,非事务方法将在没有事务上下文的情况下执行。这意味着,如果在非事务方法中发生异常,那么这个异常将不会被事务管理器捕获,也不会回滚整个事务,因为它没有事务上下文。因此,建议在事务方法中调用其他事务方法,以确保所有方法都在同一事务上下文中执行。如果确实需要在事务方法中调用非事务方法,可以使用PROPAGATION_REQUIRES_NEW传播属性将非事务方法包装在新的事务中。
spring 调用本类方法 事务失效场景
在Spring中,当一个类的方法被另一个方法调用时,如果两个方法都属于同一个类,且在同一个类的实例中被调用,那么默认情况下是不会发生事务的传播的,即调用本类方法不会触发事务。
具体来说,当一个类的方法A被另一个方法B调用时,如果方法A上标注了@Transactional注解,而方法B没有标注@Transactional注解,那么在方法B中调用方法A时,事务是不会起作用的。这是因为 Spring的事务是基于代理实现的,事务的控制是通过AOP(面向切面编程)实现的。而在同一个类中的方法调用是通过普通的Java方法调用,不会经过AOP的处理,所以事务的控制也无法传播到被调用的方法中。
为了解决这个问题,我们可以通过两种方式来保证事务传播:
1. 将方法B也标注为@Transactional,这样在方法B中调用方法A时,事务会正常起作用。
2. 将方法A抽离出来,放在单独的一个类中,而不是同一个类中的另一个方法调用,这样事务也会正常起作用。
总结起来,调用本类方法时,事务失效的场景是:在同一个类中的方法调用。为了解决这个问题,可以将调用的方法也标注为@Transactional,或者将该方法抽离出来放到单独的类中。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)