声明式事物与数据库异常

文章通过一段Java代码展示了在更新订单主表时遇到的问题。代码中使用了@Transactional注解处理事务,当更新操作异常时,如字段过长,日志表的写入行为成为关注点。作者首先提出两个猜想:1)事务回滚会包括日志写入;2)数据库异常不会导致事务回滚。最终,代码执行结果显示异常导致了事务回滚,包括日志表的写入,这与猜想2相悖,引发讨论。
摘要由CSDN通过智能技术生成

先看如下代码,主要做两件事情

  1. 写入日志表一条记录,tiExceptionLogService.insertExceptionRecord();

  1. 更新订单主表,result = ppDeliveryService.updatePpDelivery(ppDelivery);

    @ApiOperation(value = "模拟更新订单主表异常-并发1", notes = "模拟更新订单主表异常-并发1")
    @PostMapping(value = "updateDeliveryException1")
    @Transactional(rollbackFor = Exception.class)
    public PpDelivery updateDeliveryException1(@RequestBody PpDelivery ppDelivery) {
        tiExceptionLogService.insertExceptionRecord(ppDelivery, "", "模拟事物问题");
        for (int i = 0; i < 3; i++) {
            Integer result = 0;
            Boolean isException = false;
            try {
                result = ppDeliveryService.updatePpDelivery(ppDelivery);
                Thread.sleep(20000);
                if (result == 1) {
                    break;
                }
            } catch (Exception e) {
                logger.error("ylToDPSOrderStatusFeedbackImpl update exception ppDelivery: {}", JSON.toJSONString(ppDelivery, SerializerFeature.WriteMapNullValue), e);
                tiExceptionLogService.insertExceptionRecord(ppDelivery, e.getMessage(), "更新订单主表失败,数据库执行新增异常");
                isException = true;
            }
            if (result == 0 && Boolean.FALSE.equals(isException)) {
                logger.error("ylToDPSOrderStatusFeedbackImp update failed ppDelivery: {}", JSON.toJSONString(ppDelivery, SerializerFeature.WriteMapNullValue));
                tiExceptionLogService.insertExceptionRecord(ppDelivery, String.valueOf(result), "更新订单主表失败,数据库执行新增未返回成功");
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                logger.error("ylToDPSOrderStatusFeedbackImpl interruptedException ppDelivery: {}", JSON.toJSONString(ppDelivery, SerializerFeature.WriteMapNullValue));
            }
        }
        return ppDelivery;
    }

疑问:如果更新订单表异常,比如某个字段过长,那么日志表是否会写入成功

异常如下

猜想1,因为该方法加了声明式事物,更新方法执行异常,写入逻辑肯定也会回滚

猜想2,声明式事物中所捕获的异常,不包含数据库异常,是无法捕获的,写入逻辑正常写入,不会回滚

结论

符合猜想2

20230320 记录一次数据库写入异常

  1. 代码

  1. 异常

  1. 结果:回滚了

奇怪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值