java @Transactional 注解类内部调用不回滚问题解决

今天帮同事看一个问题,关于事务在同一个类中,一个方法调用另一个方法 事务不回滚问题,这问题以前也遇到过,不过这次是在springboot项目中来解决,现在直接把方法写出来。

1. POM文件引入 如下:

复制代码
        <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>
复制代码

2. 在springboot启动类上,添加注解,如下:

复制代码
package com.szl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication
public class DemoSzlApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoSzlApplication.class, args);
    }
}
复制代码

3. 主要实现类,如下:

复制代码
package com.szl.service.impl;

import com.szl.mapper.DemoSzlMapper;
import com.szl.mapper.entity.DemoSzl;
import com.szl.service.DemoSzlService;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.beans.Transient;
import java.util.Date;

@Service("demoSzlService")
public class DemoSzlServiceImpl implements DemoSzlService {
    @Autowired
    private DemoSzlMapper demoSzlMapper;

    @Override
    @Transactional
    public void saveTest1() {
        DemoSzl ds1 = new DemoSzl("szl001", new Date());
        demoSzlMapper.insert(ds1);
        try {
// 此处如果方法执行失败,就可以回滚成功。 ((DemoSzlServiceImpl) AopContext.currentProxy()).saveTest2(); }
catch (Exception e) { e.printStackTrace(); } } @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveTest2() { try { DemoSzl ds2 = new DemoSzl("szl002", new Date()); demoSzlMapper.insert(ds2); int t = 1 / 0; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("错误"); } } }
复制代码

OK, 记录完毕,以上本人亲测已验证。

 

posted @   JimmyShan  阅读(1353)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示