关于商品图片添加的问题

来源:8-3 商品添加之Service层的实现下

慕用4013838

2020-06-16

老师好,我在做添加商品这个步骤,有下面几个问题:

  1. 商品本身添加到数据库这个步骤,和添加商品缩略图,以及商品详情图的的步骤是同步还是异步的?
  2. 因为创建缩略图,创建详细图, 和储存商品信息到数据库出错抛出的都是RuntimeException;如果其中任意一个步骤出错,Transactional的机制是否可以帮助回滚其它两个步骤?还是说因为Transactional只作用于数据库,根据目前使用的代码,并不能帮助回滚图片的创建?但是如果图片也储存到一个支持事物回滚的数据库(图片文件交给数据库管理),那么三个步骤中任意一个步骤出错都可以帮助另外两个步骤回滚了?
  3. 我在现在的代码都是使用抛出异常的办法来解决的,但我在Test里面测试的时候这种办法好像会让程序被中断。我理想的情况是不中断程序,返回给前端一个错误码,同时还可以保证数据库的回滚,不知道是不是可以通过优化try catch的结构来做到。

编辑:我现在处理的办法是在添加商品详情图的方法上添加Transactional,并将其可见性更改成public. 在每个shop图片存放的文件夹下增加一个product子文件夹,然后在product子文件夹里面根据拿到的productId创建一个子文件夹用于存放商品详情图片(这里通过更改PathUtil实现)。在imageUtil里面制作图片的部分的cache里面添加一个逻辑”如果文件夹是新建的就删除文件夹“
但是这样的话我测试下来发现,如果创建商品详情图失败的话数据库关于product和productImg的添加都会回滚,但是product的自增主键仍旧会增加。是不是说数据库即使回滚自增主键也不会减小?还是说的我的代码有问题。

PS: 我的代码的地址: https://github.com/ZUOYANGDING/o2o
麻烦老师了,谢谢

写回答

1回答

翔仔

2020-06-17

同学好,

  1. 是同步的,因为都在一个事务内,但是用户提交请求是异步的

  2. 因为Transactional只作用于数据库,根据目前使用的代码,并不能帮助回滚图片的创建,如果想要回滚图片,可以在catch里面编写删除图片的逻辑,这样也能实现回滚;如果图片入库,也是受数据库事务控制

  3. 可以直接用全局异常处理逻辑来处理,这样就不需要使用try catch 或者在catch里继续抛出异常即可,后续2.0我们会加入全局异常处理机制,以减少try catch的编写

  4. 但是product的自增主键仍旧会增加 --- 这个不管成功还是失败,自增主键都会增加的,这个不影响程序运行,是正常现象

0
1
慕用4013838
谢谢老师
2020-06-17
共1条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程