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大事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot+vue实现页面下载文件

    springboot+vue实现页面下载文件

    这篇文章主要为大家详细介绍了springboot+vue实现页面下载文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 高并发下restTemplate的错误分析方式

    高并发下restTemplate的错误分析方式

    这篇文章主要介绍了高并发下restTemplate的错误分析方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot配置文件读取pom文件信息方式

    springboot配置文件读取pom文件信息方式

    这篇文章主要介绍了springboot配置文件读取pom文件信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java TCP网络通信协议详细讲解

    Java TCP网络通信协议详细讲解

    TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层
    2022-09-09
  • Android中Parcelable的作用实例解析

    Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下
    2014-08-08
  • java判断http地址是否连通(示例代码)

    java判断http地址是否连通(示例代码)

    这篇文章通过实例代码给大家介绍了java判断http地址是否连通,文末给大家补充知识点url.openconnection() 设置超时时间的方法,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • java冷知识:javac AbstractProcessor详解

    java冷知识:javac AbstractProcessor详解

    这篇文章主要介绍了java冷知识:javac AbstractProcessor详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java使用RSA与AES加密解密的实例代码详解

    java使用RSA与AES加密解密的实例代码详解

    这篇文章主要介绍了java使用RSA与AES加密解密的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Java性能优化之数据结构实例代码

    Java性能优化之数据结构实例代码

    这篇文章主要介绍了Java性能优化之数据结构实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java遍历机制性能的比较详解

    java遍历机制性能的比较详解

    这篇文章主要给大家介绍了关于java遍历机制性能比较的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论