java事务不生效场景_java注解@Transactional事务类内调用不生效问题及解决办法
时间: 2023-08-02 22:23:40 浏览: 83
在 Java 中,使用 @Transactional 注解可以实现事务管理。但是在某些情况下,@Transactional 注解可能不会生效,比如注解在事务类的内部方法上。
这是因为 Spring AOP 默认只拦截通过 Spring 容器管理的 Bean 的方法调用,而事务类通常是使用自调用的方式,因此不会被 Spring AOP 拦截。
解决这个问题的方法是使用 AspectJ。AspectJ 是一种基于语言的 AOP 实现方式,可以在编译期或者运行期织入切面。
具体实现如下:
1. 添加 AspectJ 依赖
```xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
```
2. 配置 Spring,启用 AspectJ 自动代理
```xml
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<aop:aspectj-autoproxy />
```
3. 在事务类上添加 @Aspect 注解,并实现一个切面类
```java
@Aspect
@Component
public class TransactionAspect {
@Autowired
private PlatformTransactionManager transactionManager;
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
public void transactionalMethod() {}
@Around("transactionalMethod()")
public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
Object result;
try {
result = joinPoint.proceed();
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
return result;
}
}
```
这个切面类会拦截所有被 @Transactional 注解标记的方法,并使用事务管理器执行事务。
以上就是解决注解@Transactional事务类内调用不生效问题的方法。
阅读全文