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

大事务引发的问题

在 分 享 解 决 办 法 之 前 ,先 看 看 系 统 中 如 果 出 现 大 事 务 可 能 会 引 发 哪 些 问题
在这里插入图片描述

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 ();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值