Service事务优化(方法能否被事务控制?)

1.updateFile方法是否应该开启事务?

目前如果在updateFile方法上添加@Transactional,当调用updateFile方法前会开启数据库事务,如果上传文件过程时间较长(例如用户在上传超大视频文件),那么数据库的食物持续时间也会变长(因为在updateFile方法中,我们即要将文件上传到minio,又要将文件信息写入数据库),这样数据库连接释放就慢,最终导致数据库链接不够用。

那么解决办法也显而易见,那就是只在addMediaFilesToDB方法上添加事务控制即可,同时将uploadFile方法上的@Transactional注解去掉

但事情并不是那么简单,首先我们来看一下Spring的事务控制:

2.判断方法能否被事务控制?

1.是不是通过代理对象调用的方法
2.该方法上是否添加了@Transactional注解

现在只满足了添加事务注解,那么如何判断是不是通过代理对象调用的方法呢?
我们可以打个断点看一下,当我们在一个不能被事务控制的方法里(uploadFile),调用一个被事务控制的方法(addMediaFilesToDB),那么该方法(addMediaFilesToDB)也不会被事务控制。

3.那么如何解决呢?

我们需要通过代理对象去调用addMediaFilesToDB方法
在MediaFileService的实现类中注入MediaFileService的代理对象(自己代理自己)

@Autowired
MediaFileService currentProxy;

将addMediaFilesToDB方法提取成接口

/**
  * 将文件信息添加到文件表
  *
  * @param companyId           机构id
  * @param uploadFileParamsDto 上传文件的信息
  * @param objectName          对象名称
  * @param fileMD5             文件md5码
  * @param bucket              桶
  * @return
  */
 MediaFiles addMediaFilesToDB(Long companyId, UploadFileParamsDto uploadFileParamsDto, String objectName, String fileMD5, String bucket);

通过代理对象调用addMediaFilesToDB

MediaFiles mediaFiles = currentProxy.addMediaFilesToDB(companyId, uploadFileParamsDto, objectName, fileMD5, bucket_files);

再次测试事务是否可以正常控制,打断点看到这次是代理对象调用的方法。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值