Java注解@Transactional事务类内调用不生效问题及解决办法
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
Java注解@Transactional事务类内调用不生效问题及解决办法 Java注解@Transactional是Java中的一种注解,主要用于标记事务边界。然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用时。这是因为Spring的AOP代理机制的限制所致。 在Spring框架中,@Transactional注解是通过AOP代理来实现事务管理的。在默认情况下,只有外部调用目标方法时,Spring才会生成代理对象来管理事务。但是,如果在同一个类中的其他方法调用有@Transactional注解的方法时,Spring不会生成代理对象,导致事务不生效。 例如,以下代码中,dosome()方法上有@Transactional注解,但是如果在action()方法中调用dosome(),事务不会生效: ```java @Service public class A { public void action() { dosome(); } @Transactional public void dosome() { doa.insert(new Object()); } } ``` 解决方案是使用AspectJ对方法进行切面,强制使用AspectJ对方法进行切面。为此,我们需要在pom.xml文件中添加AspectJ依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> ``` 然后,在启动类中添加@EnableAspectJAutoProxy(exposeProxy = true)注解: ```java @SpringBootApplication @EnableAspectJAutoProxy(exposeProxy = true) public class DonngPartsApplication { public static void main(String[] args) { SpringApplication.run(DonngPartsApplication.class, args); } } ``` 注意,exposeProxy = true是必须的,否则会报错:java.lang.IllegalStateException:Cannot find current proxy。 在代码中,我们可以使用AopContext.currentProxy()来获取当前代理对象,并将其强制转换为目标对象,例如: ```java @Service public class A { public void action() { ((A) AopContext.currentProxy()).dosome(); } @Transactional public void dosome() { doa.insert(new Object()); } } ``` 这样,事务就生效了。 此外,@Transactional注解还提供了一些其他属性,可以根据需要进行配置: * name:指定事务管理器的名称。 * propagation:指定事务的传播行为,默认值为REQUIRES_NEW。 * isolation:指定事务的隔离度,默认值采用DEFAULT。 * timeout:指定事务的超时时间,默认值为-1。 * readOnly:指定事务是否为只读事务,默认值为false。 * rollbackFor:用于指定能够触发事务回滚的异常类型。 例如: ```java @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.REPEATABLE_READ, timeout = 30, readOnly = false, rollbackFor = Exception.class) public void dosome() { doa.insert(new Object()); } ``` @Transactional注解是Java中的一种强大工具,用于管理事务边界。然而,在某些情况下,@Transactional注解可能不会生效,需要使用AspectJ对方法进行切面来解决问题。
- 粉丝: 2
- 资源: 928
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助