同一个类 @Transactional
时间: 2023-10-22 16:31:22 浏览: 58
在同一个类中使用@Transactional注解可以用来控制方法的事务行为。当一个方法在同一个类中调用另外一个带有@Transactional注解的方法时,可能会遇到事务失效的问题。这是因为直接调用同一个类中的方法相当于跳过了代理对象,直接将代码复制到调用的方法内部,而事务是通过代理对象来控制的。因此,b方法和c方法的事务设置在a方法中调用时会失效。
为了解决这个问题,可以使用AopContext.currentProxy()方法来获取当前代理对象,并通过该对象调用方法b和方法c。这样就可以保证在同一个类中调用方法时,事务仍然能够生效。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
相关问题
@Transactional在同一个类中是否生效
在同一个类中,使用`@Transactional`注解的方法调用不生效的原因是因为Spring的事务机制是基于代理模式实现的。当一个类被Spring容器管理时,Spring会为该类创建一个代理对象,代理对象负责管理事务的开启、提交和回滚等操作。而在同一个类中的方法调用,实际上是通过对象的引用直接调用的,而不是通过代理对象调用的,所以`@Transactional`注解不会生效。
解决这个问题的方法是将方法调用改为通过代理对象调用。可以通过以下两种方式实现:
1. 将方法调用提取到另一个类中,并通过依赖注入的方式将该类注入到原始类中。然后在原始类中通过注入的对象调用方法。这样就能保证方法调用是通过代理对象进行的,从而使`@Transactional`注解生效。
2. 在同一个类中,将需要使用`@Transactional`注解的方法抽取到一个独立的方法中,并通过`this`关键字调用该方法。这样也能保证方法调用是通过代理对象进行的,从而使`@Transactional`注解生效。
需要注意的是,以上两种方式都需要确保方法调用是通过代理对象进行的,才能使`@Transactional`注解生效。
@Transactional同一个类中怎么回滚
在同一个类中使用`@Transactional`注解实现回滚,可以通过抛出`RuntimeException`或其子类的异常来触发回滚。`@Transactional`默认只回滚`RuntimeException`及其子类异常,不会回滚`Exception`及其子类异常。如果你希望回滚`Exception`异常,可以使用`@Transactional(rollbackFor = Exception.class)`来指定。在你提供的代码示例中,第一个例子中使用了`@Transactional(rollbackFor = Exception.class)`,所以回滚成功;而第二个例子中没有指定回滚的异常类型,默认只回滚`RuntimeException`及其子类异常,所以回滚失效。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![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)