MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决
问题
mybatis有如下代码获取序列作为主键
IdMapper.java
@Select("SELECT TABLE.NEXTVAL FROM DUAL")
String getId();
同一事务循环调用查询伪代码
@Transactional(rollbackFor = Exception.class)
public QueryMedicalFeeRes queryMedicalFee(QueryMedicalFeeReq req) {
for (Obj o : objs) {
Long id = idMapper.getId();
log.info("id{}",id);
}
}
输出如下:id都是1
id1
id1
id1
id1
原因
因为MyBatis的一级缓存导致的。而且MyBatis默认开启一级缓存,这样就会导致循环调用查询方法的时候,直接从缓存获取,不会查询数据库,从而获取到的数据都是缓存数据。
但请注意,并不是所有查询都不使用一级缓存!而是当你需要查询的内容是需要变化的时候才要禁用一级缓存。如:查询Oracle的序列、查询存储过程获取主键值等情况才需要禁用一级缓存。
解决办法
禁用一级缓存
<select id="getId" resultType="java.lang.Long" useCache="false" flushCache="true">
SELECT TABLE.NEXTVAL AS ID FROM DUAL
</select>
@Select("SELECT TABLE.NEXTVAL FROM DUAL")
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
String getId();
如果是存储过程
<select id="getId" resultType="java.lang.Long" statementType="CALLABLE" useCache="false" flushCache="true">
{call GET_NEXT_ID(#{identity,mode=IN,jdbcType=VARCHAR},#{tableName,mode=IN,jdbcType=VARCHAR},#{count,mode=IN,jdbcType=INTEGER},#{currentNo,mode=OUT,jdbcType=INTEGER})}
</select>
```java
@Select("{call GET_NEXT_ID(#{identity,mode=IN,jdbcType=VARCHAR},#{tableName,mode=IN,jdbcType=VARCHAR},#{count,mode=IN,jdbcType=INTEGER},#{currentNo,mode=OUT,jdbcType=INTEGER})}")
@Options(statementType = StatementType.CALLABLE, useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
String getId();
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Apache SkyWalking 监控 MySQL Server 实战解析
这篇文章主要介绍了Apache SkyWalking 监控 MySQL Server 实战解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-09-09
webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码
这篇文章主要介绍了webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码,需要的朋友可以参考下2017-04-04
Spring整合redis(jedis)实现Session共享的过程
这篇文章主要介绍了Spring整合redis(jedis)实现Session共享,需要的朋友可以参考下2018-06-06
Activiti explorer.war示例工程使用过程图解
这篇文章主要介绍了Activiti explorer.war示例工程使用过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-03-03
idea mabatisX插件生成mapper.xml文件全过程
文章介绍了如何在IntelliJ IDEA中使用MybatisX插件自动生成MyBatis的Mapper和XML文件,步骤包括安装插件、选择数据库表并右键选择MybatisX-Generator进行配置和生成2026-03-03


最新评论