Springboot @Transactional大事务处理的几点建议

 更新时间:2025年01月16日 09:21:08   作者:哈喽,树先生  
本文主要介绍了大事务的概念及其危害,并提出了几种解决大事务问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.大事务:

总体任务对应的事务运行时间比较长,长时间未提交的事务。

2.大事务的危害:

a.并发情况下,数据库连接池资源占满。大事务提交不及时,导致连接资源释放缓慢。
b.数据库死锁和锁等待。mysql innodb存储引擎背景下,事务如果占用了排他锁,会容易导致并发情况下数据死锁或者锁等待。
c.大事务Rt时间长,容易导致接口超时。
d.大事务回滚时间长。
e.数据库主从架构下,数据同步延迟

3.解决办法

3.1 将声明式事务的@Transactional方式 合理的替换为 编程式事务TransactionTemplate 的方式

声明式事务的粒度最小是整个方法,可能会导致业务里不必要的逻辑都加了事务。编程式事务细化需要加事务的逻辑上,形成实际有用的事务块。

@Autowired
private TransactionTemplate transactionTemplate;

public void testTransaction() {
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            try {
                // ....  业务代码
            } catch (Exception e){
                //回滚
                transactionStatus.setRollbackOnly();
            }
        }
    });
}

3.2 将查询放在事务方法外

使用@Transactional 又想避免产生大事务,需对方法进行拆分,将不需要事务管理的逻辑与事务操作分开

@Service
public class TransactionTestService{

// 避免同一个类内部方法相互调用,实例方法调用代理方法而导致事务失效
    @Resource
    private TransactionTestService service;

    public void create(ParamDto dto){
        queryData1();
        queryData2();
        service.save(dto);
    }
  
	//事务操作
    @Transactional(rollbackFor = Exception.class)
    public void save(ParamDto dto){
        paramDao.insert(dto);
    }
}

3.3 避免跨服务间的远程调用

服务间的通讯及服务之间的调用时间 受网络环境和远端接口Rt时间的影响,可能会比较耗时。

反例:
	//事务操作
    @Transactional(rollbackFor = Exception.class)
    public void save(ParamDto dto){
    // 调用了其他服务
        otherRemoteApi();
        paramDao.insert(dto);
    }
    
修改为:
	@Autowired
    private TransactionTemplate transactionTemplate;
    
    public void save(ParamDto dto){
    // 调用了其他服务
        otherRemoteApi();
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            try {
                  paramDao.insert(dto);
            } catch (Exception e){
                //回滚
                transactionStatus.setRollbackOnly();
            }
        }
    });
      
    }

3.4 事务中不应该一次性处理太多的数据,可以使用分批执行

3.5事务中的方法可以根据业务使用异步执行

到此这篇关于Springboot @Transactional大事务处理的几点建议的文章就介绍到这了,更多相关Springboot @Transactional大事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java持久层框架MyBatis简单实例

    Java持久层框架MyBatis简单实例

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。本文重点给大家介绍Java持久层框架MyBatis简单实例,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • SpringMVC中的拦截器详解及代码示例

    SpringMVC中的拦截器详解及代码示例

    这篇文章主要介绍了SpringMVC中的拦截器详解及代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 如何在Spring Boot框架中使用拦截器实现URL限制

    如何在Spring Boot框架中使用拦截器实现URL限制

    在Spring Boot框架中,您可以使用拦截器(Interceptor)来控制限制URL列表,本文通过一个简单的示例给大家介绍Spring Boot 拦截器实现URL限制的操作方法,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • 序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化版本号serialVersionUID的作用_动力节点Java学院整理

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象,这篇文章主要介绍了序列化版本号serialVersionUID的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Maven打包后找不到class文件的问题

    Maven打包后找不到class文件的问题

    本文主要介绍了Maven打包后找不到class文件的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • idea 设置支持ES6语法的操作

    idea 设置支持ES6语法的操作

    这篇文章主要介绍了idea设置支持ES6语法的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java nio中的ByteBuffer扩展问题

    java nio中的ByteBuffer扩展问题

    这篇文章主要介绍了java nio中的ByteBuffer扩展问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 基于Java实现收发电子邮件功能

    基于Java实现收发电子邮件功能

    Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能,本文就来为大家详细讲讲实现步骤
    2022-07-07
  • Java中的LinkedBlockingQueue源码解析

    Java中的LinkedBlockingQueue源码解析

    这篇文章主要介绍了Java中的LinkedBlockingQueue源码解析,LinkedBlockingQueue底层是一个链表(可以指定容量,默认是Integer.MAX_VALUE),维持了两把锁,一把锁用于入队,一把锁用于出队,并且使用一个AtomicInterger类型的变量保证线程安全,需要的朋友可以参考下
    2023-12-12
  • 详解如何在SpringBoot里使用SwaggerUI

    详解如何在SpringBoot里使用SwaggerUI

    本篇文章主要介绍了详解如何在SpringBoot里使用SwaggerUI,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02

最新评论