我正在使用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]
交易是否会影响结果?
答案 0 :(得分:1)
似乎,检索生成的id的值的查询使用了与mysql的单独连接。
这是来自mysql documentation的LAST_INSERT_ID
函数:
生成的ID会在每个连接的基础上保留在服务器中。这意味着该函数返回给定客户端的值是针对该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值
您正在使用连接池,并且根据其配置,可能会使用不同的本机JDBC Connection
对象执行不同的查询,即使用与mysql的不同连接。因此,第二个查询将返回(在较早的时间)针对池中的错误连接生成的值。
要解决此问题,您需要配置连接池,以使其在每个语句之后都不会释放连接。您需要对其进行配置,以使该池使用相同的连接,直到您的代码释放代理连接为止(即,当mybatis在事务结束时关闭连接时)。