记录一次数据库异常,事物未回滚

一,场景

通过excel导入订单数据,比如50条数据,循环调用以下代码写入订单数据(新增1),同时写入附加信息(新增2),出现了异常(新增2因字段过长写表异常),前端抛出异常如下。用户反馈,部分数据导入成功,部分失败。

二,代码

@Override
@Transactional(rollbackFor = Throwable.class)
public void commonCreatOrder(OrderInfoDTO orderInfoDTO, List<TrOrderExtraRecordField> orderExtraRecordFieldArrayList) {

//新增1
TtOrder ttOrder = BeanHelper.copyProperties(orderInfoDTO, TtOrder.class);

//新增2
count = addrService.batchInsert(ttAddrs);
    
}

三,报错信息

四,分析

比较奇怪,代码有声明式事物,代码报错,应该事物回滚,全部写入失败。实际是50条数据,46条成功,4条失败,查看数据发现,第47条数据,有个字段过长导致如上报错,后面3条数据也没有再写入,相当于中断了,数据库异常,没有回滚,只是程序中断。

初步判断,声明式事物检查的是java异常体系,抛出的是数据库异常,并不属于java异常体系,实际无法捕获,所以没有回滚。

参考:

https://mp.csdn.net/mp_blog/creation/editor/new/129279679


版权声明:本文为C18298182575原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。