Spring事务下偶发性出现数据未更新

问题遇到的现象和发生背景

在Spring中添加事务,发现会偶发性出现数据未成功更新的情况,但在日志中显示成功执行了sql。按网上的解决方法来手动开启提交事务也会出现一样的问题。但将事务取消在执行就能成功更新。请问如何在保留事务的前提下,修改代码


  @Autowired
    PlatformTransactionManager platformTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;
    @Override
//    @Transactional(rollbackFor = Exception.class)
    public HttpResult cooperationAdd(CooperationAdd add) {
//        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
//        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
        try {

//            List<Map<String, Object>> result = outCheckMapper.getFhpz(add.getPzh(), add.getSwh(), add.getCgddh(), add.getCgddhh());
////            if(result != null && result.size() != 0) {
////                list = result;
////            }
            for(CG cg:add.getCglist()){
                cooperationMapper.cgAdd(cg, add);
            }
            for(DE de:add.getDelist()){
                cooperationMapper.deAdd(de);
            }
            for(TM tm:add.getTmlist()){
                cooperationMapper.tmAdd(tm, add);
            }
            platformTransactionManager.commit(transactionStatus);
            return HttpResult.ok();
        }catch (Exception e){
            platformTransactionManager.rollback(transactionStatus);
            return HttpResult.error(e.getMessage());
        }
    }

运行结果及详细报错内容

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

使用注解和手动开启事务切换,但没效果

【相关推荐】



  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/747179
  • 除此之外, 这篇博客: spring事务总结中的        1、事务的传播行为是解决开发中实际问题的,例如 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

                    service1 (业务层,调用dao1,dao2)

                                  xxx1()<---------------------------------------- xxx1Dao()持久层

                    aaa()

                                  xxx2()<-----------------------------------------xxx2Dao()持久层

                    service2(业务层,调用dao3,dao4)

                                  xxx3()<---------------------------------------- xxx3Dao()持久层

                   bbb()

                                  xxx4()<-----------------------------------------xxx4Dao()持久层

                    出现复杂的情况:

                                同时调用service1.aaa() 和 service2.bbb()方法才能完成一个业务员;假如aaa()有事务,bbb()有事务,那么应该                              调用哪个事务呢?


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^