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

这篇具有很好参考价值的文章主要介绍了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);

再次测试事务是否可以正常控制,打断点看到这次是代理对象调用的方法。
Service事务优化(方法能否被事务控制?)文章来源地址https://www.toymoban.com/news/detail-465169.html

到了这里,关于Service事务优化(方法能否被事务控制?)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序关于wxs语法、以及能否引入js中的方法(不能调用)

    页面中使用wxs 或者  参考:WXS | 微信开放文档 wxs能引入外部js文件吗 | 微信开放社区 微信小程序中的WXS语法 1、WXS 中不支持let和const,不支持箭头函数。 2、变量命名必须符合下面两个规则: 首字符必须是:字母(a-zA-Z),下划线(_) 剩余字符可以是:字母(a-zA-Z),下划

    2024年02月06日
    浏览(64)
  • 声明式事务控制

    PlatformTransactionManager PlatformTransactionManager接口是spring的事务管理器,它里面提供了常用的操作事务的方法 方法 说明 TransactionStatus getTransaction(TransactionDefaultion defination) 获取事务的状态信息 void commit(TransactionStatus status) 提交事务 void rollback(TransactionStatus status) 回滚事务 注意 :

    2024年02月08日
    浏览(31)
  • Spring事务控制

    目录 1、什么是事务控制 2、编程式事务控制 2.1、简介 2.2、相关对象 2.2.1、PlatformTransactionManager 2.2.2、TransactionDefinition 2.2.2.1、事务隔离级别 2.2.2.2、事务传播行为 2.2.3、TransactionStatus 3、声明式事务控制 3.1、简介 3.2、区别 3.3、⭐作用 3.4、🔺基于xml 3.4.1、引入tx命名空间 3.4

    2024年02月13日
    浏览(32)
  • 27.Spring的事务控制

    目录 一、编程式事务控制相关对象。 (1)事务管理器。 (2)事务定义信息对象(如隔离级别、传播行为)。 (3)事务状态对象。 (4) 知识要点。 二、声明式事务控制—基于xml或注解。 (1)声明式事务控制的定义。  (2)声明式事务控制——基于xml配置。 (2.1) x

    2023年04月26日
    浏览(30)
  • Spring控制事务回滚

    1、Spring中开启事务的方式主要有两种: 编程式事务和声明式事务 。 2、事务是我们开发过程中经常会使用到的,为了在业务执行过程中出现异常时,回滚到原始状态。而事务的回滚在大多数情况下都是靠着 exception (异常)来触发回滚的,当事务机制捕捉到异常,就会开始回

    2024年02月09日
    浏览(33)
  • Jmeter性能 —— 事务控制器

    统计性能测试结果一定会关注TPS,TPS表示: 每秒处理事务数 ,JMeter默认每个事务对应一个请求。我们可以用逻辑控制器中的事务控制器将多个请求统计为一个事务。 1、添加事务控制器 2、事务控制器参数说明 Generate parent sample:如果事务控制器下有多个取样器,勾选它,那

    2024年02月08日
    浏览(39)
  • Spring JDBC和事务控制

    ​ Spring 框架除了提供 IOC 与 AOP 核心功能外,同样提供了基于JDBC 的数据访问功能,使得访问持久层数据更加方便。想要使用 Spring JDBC 环境,需要将JDBC整合到Spring中。 构建项目添加依赖坐标 构建项目:普通的java项目即可 添加 jdbc 配置文件 在src/main/resources目录下新建db.pro

    2024年02月04日
    浏览(30)
  • 【Jmeter教程】_事务控制器

    目录 一、添加事务控制器 二、事务控制器参数说明 三、运用事务控制器 统计性能测试结果一定会关注TPS,TPS表示 每秒处理事务数 ,JMeter默认每个事务对应一个请求。我们可以用逻辑控制器中的 事务控制器 将多个请求统计为一个事务。 Generate parent sample:如果事务控制器下

    2024年02月11日
    浏览(41)
  • spring项目里的大事务优化

    声明式事务只需要加在方法头加@Transactional注解即可开启事务,但是还是不太灵活,意味着整个方法所进行对数据库操作都要加进事务,当然一次查询也要进入事务,这并不是我们想要的,我们在update、insert操作上进行事务操作,方便进行回滚。 在使用事务之前,我们都应该

    2024年02月05日
    浏览(34)
  • SpringAOP以及事务管理和优化处理

    本篇章中所有的代码都将会放置到git仓库中去,并且会做一个简要的说明。 一、个人理解描述 Spring中所谓的AOP就是在不修改源码的情况下,来进行增强。 所谓的增强其实就是在方法执行前后添加一些额外操作。 所谓的增强,就是我们如何来对方法(以类中的方法为基本单位

    2024年01月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包