@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