zongzibinbin / MallChat

mallchat的后端项目,是一个既能购物又能聊天的电商系统。以互联网企业级开发规范的要求来实现它,电商该有的购物车,订单,支付,推荐,搜索,拉新,促活,推送,物流,客服,它都必须有。持续更新ing。。(点个star,不迷路)
Apache License 2.0
2.82k stars 744 forks source link

fix:SecureInvoke注解同步出现bug #133

Closed ispengya closed 9 months ago

ispengya commented 10 months ago
  1. 当SecureInvoke注解实现同步执行的时候, 在执行反射的时候第二次进入切面,还处于事务当中 ,这样不但不会执行方法,本地消息表还会多一条记录。(在执行异步的时候由于不是一个线程,所以不会出现此问题)
  2. TransactionSynchronizationManager维护了很多ThreadLocal 输入图片说明
  3. TransactionSynchronizationManager里面提供了静态方法clear(),所以在确定事务提交之后手动调用此方法即可
TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronization() {
        @SneakyThrows
        @Override
        public void afterCompletion(int status) {
            if (status==TransactionSynchronization.STATUS_COMMITTED){
                //事务成功提交,手动清理ThreadLocal
                TransactionSynchronizationManager.clear();
                //事务后执行
                if (async) {
                    doAsyncInvoke(record);
                } else {
                    doInvoke(record);
                }
            }
        }
     });
zongzibinbin commented 10 months ago

能不能提供下具体出现bug的代码,我复下

ispengya commented 10 months ago

@zongzibinbin @Transactional public void test(){ mqProducer.sendSecureMsg("ispengya","test","test"); } 测试先把定时任务注释掉,那条数据会被定时任务执行,造成了数据表没有信息的假象