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(){
        
    }
}
相关推荐
云动雨颤几秒前
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
数据库·spring boot·tomcat
二饭1 分钟前
Spring Boot 项目启动报错:MongoSocketOpenException 连接被拒绝排查日记
java·spring boot·后端
Dxy12393102162 分钟前
python把文件从一个文件复制到另一个文件夹
开发语言·python
懒虫虫~19 分钟前
通过内存去重替换SQL中distinct,优化SQL查询效率
java·sql·慢sql治理
鼠鼠我捏,要死了捏23 分钟前
基于Redisson的分布式锁原理深度解析与性能优化实践指南
java·高并发·redisson
backordinary33 分钟前
微服务学习笔记25版
java·java-ee
酷飞飞38 分钟前
Qt Designer与事件处理
开发语言·qt·命令模式
荣达1 小时前
koa洋葱模型理解
前端·后端·node.js
ZZHow10241 小时前
Maven入门_简介、安装与配置
java·笔记·maven
天雪浪子1 小时前
Python入门教程之赋值运算符
开发语言·python