@Transactional注解下,postgresql循环取序列值相同(工作中碰到的实际问题)

@Transactional注解下,postgresql循环取序列值相同

1、原有的语句:出现循环取序列值相同

	<select id="selectSeq" resultType="java.lang.String" parameterType="java.lang.String" >
  	${_parameter}
  	</select>

2、问题原因:在同一事务下,mybatis缓存导致的!

3、解决方法:在 mapper.xml 添加属性 useCache=“false” flushCache=“true” 禁用mybatis缓存后之后便可以成功增长序列。

	<select id="selectSeq" resultType="java.lang.String" parameterType="java.lang.String" useCache="false" flushCache="true">
  	${_parameter}
	 </select>

4、说明:

  • mybatis一级缓存默认开启,是sqlSession级别的缓存,在同一个sqlSession下,对相同条件的sql查询结果会进行缓存。
  • sqlSession调用flush或者close之后,会清理mybatis一级缓存;session内发生 insert、update 和 delete 操作时,会清空缓存;一个session内发生的insert、update 和 delete 操作,不会影响其他session内的一级缓存。
  • 在spring集成mybatis时,如果不开启事务,spring对于每次查询会使用不同的sqlSession,因此mybatis一级缓存是不生效的(每次查询都是一个单独的事务); 如果开启事务,spring在事务内会使用同一个sqlSession进行查询,这个时候mybatis一级缓存是生效的,而这个时候,在某些场景下我们只根据隔离级别作出的判断可能就不对了,需要注意。

参考链接:
https://www.cnblogs.com/dwxt/p/8807981.html.
https://blog.csdn.net/Genius_in_the_left/article/details/97047238
https://www.jianshu.com/p/fed09c106645

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值