一,场景
通过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异常体系,实际无法捕获,所以没有回滚。
参考:
版权声明:本文为C18298182575原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。