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(){
        
    }
}
相关推荐
求知若饥2 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
数据小爬虫@5 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.7 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy13 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader20 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默31 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood38 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑40 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb421528743 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶44 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot