大事务问题到底要如何解决?

  • Post author:
  • Post category:其他




大事务引发的问题

在 分 享 解 决 办 法 之 前 ,先 看 看 系 统 中 如 果

出 现 大 事 务 可 能 会 引 发 哪 些 问题


在这里插入图片描述



pom依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.22</version>
</dependency>



解决方法



1. 少用@Transactional 注解

@Resource

private TransactionTemplate transactionTemplate;


public void save(final User user) {
    transactionTemplate.execute ((status) -> {
        //doSameThing...
        return Boolean.TRUE;
    });
}



2. 将查询(select)方法放到事务外

@Resource
private TransactionTemplate transactionTemplate;


public void save(final User user) {
    queryData1 ();
    queryData2 ();
    transactionTemplate.execute ((status) -> {
        addData1 ();
        updateData2 ();
        return Boolean.TRUE;
    });
}

如果就是要使用

@ T r a n s a c t i o n a l 注 解 , 该 怎 么 拆 分 呢


在 本类中 注入自己,再进行调用,避免事务失效

@Service
public class ServiceA {
    @Resource
    private ServiceA serviceA;

    public void save(User user) {
        queryData1 ();
        queryData2 ();
        serviceA.doSave (user);
    }

    @Transactional(rollbackFor = Exception.class)
    public void doSave(User user) {
        addData1 ();
        updateData2 ();
    }
}



3. 事务中避免远程调用

远 程 调 用 的 代 码 可 能 耗 时 较 长 ,

切 记 一 定 要 放 在 事 务 之 外

@Resource
private TransactionTemplate transactionTemplate;


public void save(final User user) {
    callRemoteApi ();
    transactionTemplate.execute ((status) -> {
        addData1 ();
        return Boolean.TRUE;
    });
}



4. 事务中避免一次性处理太多数据


解 决 办 法



分 页 处 理

1000 条 数 据 ,分 50 页 ,一 次 只 处 理 20 条 数 据 ,这 样 可 以 大 大 减 少 大 事 务 的 出 现 。



5. 非事务执行

 @Resource
  private TransactionTemplate transactionTemplate;

  // .......

  public void save(final User user) {
      transactionTemplate.execute ((status) -> {
          addData ();
          return Boolean.TRUE;
      });
      addLog ();
      updateCount ();
  }



6. 异步处理

@Resource
private TransactionTemplate transactionTemplate;

//...

public void save(final User user) {
    transactionTemplate.execute ((status) -> {
        order ();
        return Boolean.TRUE;
    });
    sendMq ();
}



版权声明:本文为qq_30659573原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。