Java---后端事务管理

代码世界聚眸光,昼夜敲盘思绪长。
算法心间精构建,编程路上细思量。
屏前架构乾坤定,键上飞驰智慧扬。
默默耕耘成果现,创新科技铸辉煌。

目录

一,概念

二,Spring事务管理

三,rollbackFor事务回滚

四,propagation传播行为

一,概念

二,Spring事务管理

下面我们举一个小例子来演示一下

首先创建一个Service的接口:

java 复制代码
public interface IYZService {
    /**
     * 处理用户信息
     * */
    User dealUser(String name);
    /**
     * 测试
     * */
    User testUser(String name);
}

然后实现Service接口:

java 复制代码
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZService implements IYZService {

    @Autowired  //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量  这就是依赖注入
    private YZDao yzDao;

    @Override
    public User dealUser(String name) {
        User user = yzDao.findUserByName(name);
        Address address = new Address();
        address.setCity("淄博");
        address.setProvince("山东");
        user.setAddress(address);
        return user;
    }

    @Override
    public User testUser(String name) {
        User user = yzDao.findUserByName(name);
        Address address = new Address();
        address.setCity("淄博1");
        address.setProvince("山东1");
        user.setAddress(address);
        return user;
    }
}

Dao的接口和类:

java 复制代码
public interface IYZDao {
    /*
    * 根据用户姓名查找用户信息
    * **/
    User findUserByName(String name);
}
java 复制代码
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {
    @Override
    public User findUserByName(String name) {
        User user = new User();
        user.setName(name);
        user.setAge(20);
        Address address = new Address();
        address.setProvince("北京");
        address.setCity("北京");
        user.setAddress(address);
        return user ;
    }
}

Controller层代码:

java 复制代码
@RestController
public class RequestController {


    @Resource(name ="YZService")
    private IYZService yzService;

    @RequestMapping("/yzTestPath/{name}")
    public Result yzTestPath(@PathVariable String name){
        User user = yzService.dealUser(name);
        User user2 = yzService.testUser(name);
        List<User> list = new ArrayList<User>();
        list.add(user);
        list.add(user2);
        return  Result.success(list);
    }
}

测试:

下面我们先定义一个全局的异常处理器:GlobalExceptionHandler

java 复制代码
/**
 * 全局异常管理器
 * */
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result exception(Exception e) {
        e.printStackTrace();
        return Result.error("对不起,操作失败,请联系管理员");
    }
}

接下来我们模拟一个异常

java 复制代码
@RestController
public class RequestController {


    @Resource(name ="YZService")
    private IYZService yzService;

    @RequestMapping("/yzTestPath/{name}")
    public Result yzTestPath(@PathVariable String name){
        User user = yzService.dealUser(name);
        //抛出异常
        int i =1/0;
        User user2 = yzService.testUser(name);
        List<User> list = new ArrayList<User>();
        list.add(user);
        list.add(user2);
        return  Result.success(list);
    }
}

接着我们请求接口:

然后看控制台:

错误的堆栈信息也打印出来了。

接下来我们继续将事务管理,这里需要用到@Transactional这个注解:

这个注解一般是作用在业务层的曾删改这一层上面的

三,rollbackFor事务回滚

那么我们如果要指定在所有异常情况下都回滚呢?

java 复制代码
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {
    
    @Transactional(rollbackFor = Exception.class)
    @Override
    public User findUserByName(String name) {
        User user = 数据库操作
        return user ;
    }
}

四,propagation传播行为

常见的传播行为

java 复制代码
@Component //将当前容器交给IOC容器管理 成为IOC容器中的bean
public class YZDao implements IYZDao {

    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
    @Override
    public User findUserByName(String name) {
        User user = new User();
        user.setName(name);
        user.setAge(20);
        Address address = new Address();
        address.setProvince("北京");
        address.setCity("北京");
        user.setAddress(address);
        test();
        return user ;
    }
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public void test(){
        
    }
}
相关推荐
Emily1568535987013 分钟前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧5 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡5 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管5 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒6 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰6 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
唐青枫7 小时前
一个值多种形态:Zig union、Tagged Union 与内存布局实战
后端
今天AI了吗7 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
卷无止境7 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker