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);
再次测试事务是否可以正常控制,打断点看到这次是代理对象调用的方法。