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(){
        
    }
}
相关推荐
菜鸟起航ing1 分钟前
【Java面试系列】Spring Boot微服务架构下的分布式事务解决方案与性能优化详解 - 3-5年Java开发必备知识
java·spring boot·微服务·性能优化·分布式事务
南雨北斗4 分钟前
1.使用 Composer 下载 Laravel 框架
后端
小薛博客11 分钟前
架构设计之Redisson分布式锁-可重入同步锁(一)
java·redis·分布式
小开不是小可爱19 分钟前
leetcode_454. 四数相加 II_java
java·数据结构·算法·leetcode
Koma-forever19 分钟前
java设计模式-原型模式
java·设计模式·原型模式
zheshiyangyang25 分钟前
JavaScript---原型和原型链
开发语言·前端·javascript
pumpkin8451429 分钟前
理解 Rust 中的 String 分配机制
开发语言·rust
小宁学技术36 分钟前
MATLAB在工程领域的实际应用案例
开发语言·matlab·matlab实际应用案例·matlab应用案例·matlab 实际应用案例
magic 24544 分钟前
MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper
java·spring·maven·mybatis
鸿蒙布道师1 小时前
鸿蒙NEXT开发资源工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei