为什么mybatis插入不返回最后一个插入ID?

时间:2019-08-28 08:04:26

标签: mybatis

我正在使用mybatis插入这样的记录:

    @Override
    public void lockRecordHostory(OperateInfo operateInfo) {
        WalletLockedRecordHistory lockedRecordHistory = new WalletLockedRecordHistory();
        JSONObject jsonObject = JSON.parseObject(operateInfo.getParam(), JSONObject.class);
        lockedRecordHistory.setParam(operateInfo.getParam());
        int result = lockedRecordHistoryMapper.insertSelective(lockedRecordHistory);
        log.info("result:", result);
    }

为什么结果值不为1而不是最后一个插入ID?我打开mybatis的调试信息,并执行日志:

DEBUG [http-nio-11002-exec-7] - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@33d1051f] will be managed by Spring
DEBUG [http-nio-11002-exec-7] - ==>  Preparing: insert into wallet_locked_record_history ( locked_amount, created_time, updated_time, user_id, locked_type, operate_type, param ) values ( ?, ?, ?, ?, ?, ?, ? ) 
DEBUG [http-nio-11002-exec-7] - ==> Parameters: 1(Integer), 1566978734712(Long), 1566978734712(Long), 3114(Long), RED_ENVELOPE_BUMPED_LOCK(String), LOCKED(String), {"amount":1,"lockedType":"RED_ENVELOPE_BUMPED_LOCK","userId":3114}(String)
DEBUG [http-nio-11002-exec-7] - <==    Updates: 1
DEBUG [http-nio-11002-exec-7] - ==>  Preparing: SELECT LAST_INSERT_ID() 
DEBUG [http-nio-11002-exec-7] - ==> Parameters: 
DEBUG [http-nio-11002-exec-7] - <==      Total: 1
DEBUG [http-nio-11002-exec-7] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@420ad884]

交易是否会影响结果?

1 个答案:

答案 0 :(得分:1)

似乎,检索生成的id的值的查询使用了与mysql的单独连接。

这是来自mysql documentationLAST_INSERT_ID函数:

  

生成的ID会在每个连接的基础上保留在服务器中。这意味着该函数返回给定客户端的值是针对该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值

您正在使用连接池,并且根据其配置,可能会使用不同的本机JDBC Connection对象执行不同的查询,即使用与mysql的不同连接。因此,第二个查询将返回(在较早的时间)针对池中的错误连接生成的值。

要解决此问题,您需要配置连接池,以使其在每个语句之后都不会释放连接。您需要对其进行配置,以使该池使用相同的连接,直到您的代码释放代理连接为止(即,当mybatis在事务结束时关闭连接时)。