美文网首页
spring中,大事务问题

spring中,大事务问题

作者: 同吢欢楽 | 来源:发表于2023-04-05 13:26 被阅读0次

上一次,和朋友们聊了聊事务失效场景,我已经整理成了文章,Java开发中,导致事务失效的场景。紧接着有提到了大事务问题,经过一番激烈的讨论,对这个问题也算是有了一些输出场景。下面我简要描述一下。

一、概念

什么是大事务?简要来说就是:运行时间比较长,操作的数据比较多的事务。

二、大事务引发的问题

大事务对系统来说,是导致响应缓慢的一个重要原因。它会引发一些列问题,诸如:锁等待、死锁、接口超时、数据库主从延迟、事务回滚时间长、数据库连接池被占满等问题。

三、形成原因或解决办法

1. 将查询放到事务外处理。

@Transactional(rollbackFor=Exception.class)

   public void save(Entity entity) {

         selectData();

         addData(entity );

         updateData(entity );

   }

如上代码所示,一个事务中,同事包含了查询,新增,修改,这种时候,就容易出现大事务。当然,改造也很简单,把查询的放到事务外。这里就要引入另一种事务实现方式:编程式事务。上述代码是:声明式事务。

@Autowired

privateTransactionTemplate transactionTemplate;

public void save(Entity entity) {

    selectData();

      transactionTemplate.execute((obj) => {

          addData(entity );

         updateData(entity );

         returnBoolean.TRUE;

      })

}

2.尽量少用声明式事务@Transactional

我相信这种事务使用场景应该是非常广泛的,包括我所参与的项目中,使用这样的方式来配置事务占有率也是非常高的,但是为什么会建议少使用这种方式呢?

2.1 我们都知道,spring事务其实就是通过aop切面来起作用的,如果使用不当,会使得事务失效,详见我的上一篇文章。

2.2 这种事务声明,一般是用于业务代码中的某个方法,这种方法内,往往可能存在多种数据库操作,这种时候,就容易产生大事务,如上述例子。解决方法依然是:使用编程式事务来管控。

3.事务中,存在RPC调用

在事务中,如果使用了外部的远程调用、内部业务调用、MQ或Redis等,因为调用过程中的不可控的网络延迟因素,导致大事务发生或产生异常导致事务回滚。

@Transactional(rollbackFor=Exception.class)

   public void save(Entity entity) {

        feignClient.read();

        redisTemplate.get();

         addData();

   }

解决办法依然是,把需要添加事务的部分,添加事务,最常用的依然是编程式事务。

@Autowired

privateTransactionTemplate transactionTemplate;

public void save(Entity entity) {

      feignClient.read();

      redisTemplate.get();

      transactionTemplate.execute((obj) => {

         addData();

         updateData();

         returnBoolean.TRUE;

      })

}

4.异步处理

如果在业务逻辑中,需要做多步骤、多阶段操作或消息发送等,我们可以采取异步操作来处理这部分事情。把事务尽量做到精确化。

@Autowired

privateTransactionTemplate transactionTemplate;

public void save(Entity entity) {

      transactionTemplate.execute((obj) => {

         addData(entity);

         returnBoolean.TRUE;

      })

      sendMessage();

}

相关文章

  • JAVA高级工程师-面试题

    一:大框架方面问题 1、Spring 事务的隔离性,并说说每个隔离性的区别 解答:Spring事务详解 2、Spr...

  • Spring中的事务问题记录

    问题: 在事务中这个操作造成的问题。 原因:默认spring事务只在发生未被捕获的 RuntimeExcetpio...

  • Spring事务配置&&回滚失效的原因之一

    包名的配置问题 Spring 事务的隔离性 Spring事务的传播行为 事务配置 applicationConte...

  • Spring中实现事务方式

    Spring 中实现事务的方式 Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,...

  • Spring事务问题

    问题:Spring中存在类A和类B,A中存在方法methodA。B中存在方法methodB1和methodB2。m...

  • spring事务问题

    springmvc中在service层中有如下逻辑:1.提交事务2.开启新线程,新线程中的业务依赖1中提交的事务处...

  • (四)Spring的事务管理

    什么是Spring的事务管理   在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于...

  • 深入理解Spring事务的传播行为

    本文主要介绍下Spring事务中的传播行为。 事务传播行为介绍 Spring中的7个事务传播行为: 举例说明 案例...

  • Spring事务笔记--事务传播

    Spring中事务支持的重要类:TransactionDefinition Spring支持的7种事务类型: PR...

  • Spring事务之编程式事务

    一.Spring对编程式事务的支持 Spring中的事务分为物理事务和逻辑事务;物理事务:就是底层数据库提供的事务...

网友评论

      本文标题:spring中,大事务问题

      本文链接:https://www.haomeiwen.com/subject/efxjddtx.html