记录一次由事务可重复读引起的问题

Posted zjhgx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一次由事务可重复读引起的问题相关的知识,希望对你有一定的参考价值。

原由是现金贷在下单时为了让订单创建的事务时间尽可能小在插入订单后单独起一个线程去机审,结果在机审中根据这个新订单号却查不到这个订单报订单不存在,原先以为是因为创建订单的事务还没提交就去查所以查不到,所以在机审的代码里写了个循环去查,中途sleep 2s。代码如下:

            orderMapper.insertSelective(order);

            // 插入订单扩展认证信息
            orderMapper.insertOrderExtendAuth(request, order.getId(), user.getId(), request.getHeader().getIp(),
                    request.getHeader().getDeviceType());

            // 更新用户单数
            userMapper.updateOrderCount(user.getId(), order.getId());

// 判断当前用户认证状态 如果已认证 则直接机审 否则跳过进入待机审
            if (info.getCrawlStatus() == CrawlStatus.AUTHED.getCode()) {
                OrderExtend orderExtend = new OrderExtend();
                orderExtend.setUserId(user.getId());
                orderExtend.setPhone(info.getPhone());
                orderExtend.setIdCard(info.getIdCard());
                orderExtend.setOrderId(order.getId());
                orderExtend.setOrderNo(orderNo);
                orderExtend.setOrderDevicetoken(request.getDevicetoken());
                orderExtend.setReportNo(info.getReportNo());
                orderExtend.setIpAddress(request.getHeader().getIp());
                orderExtend.setXinyanToken(request.getXinyanToken());
                orderExtend.setBlackBox(request.getBlackBox());
                orderExtend.setOrderAddress(request.getOrderAddress());
                new MachineApproveThread(orderExtend).start();
            }

            response.setData(orderNo);
            logger.info(String.format("应答:%s", JsonUtil.toJSONString(response)));
            return response;

 

以上是关于记录一次由事务可重复读引起的问题的主要内容,如果未能解决你的问题,请参考以下文章

什么是脏读,不可重复读,幻读

老男孩MySQL笔记 第二天2-2

高并发服务优化篇:详解一次由读写锁引起的内存泄漏

Mysql可重复读原理

高并发服务优化篇:详解一次由读写锁引起的内存泄漏

MySQL可重复读采坑记录-对事务B进行更新时,事务A提交的更新会不会影响到事务B