@Transactional注解下,postgresql循环取序列值相同
1、原有的语句:出现循环取序列值相同
<select id="queryProjectSeq" resultType="java.lang.Integer">
select NEXTVAL('t_project_seq')
</select>
2、问题原因:在同一事务下,mybatis缓存导致的!
3、解决方法:在 mapper.xml 添加属性 useCache=“false” flushCache=“true” 禁用mybatis缓存后之后便可以成功增长序列。
<select id="queryProjectSeq" resultType="java.lang.Integer" useCache="false" flushCache="true">
select NEXTVAL('t_project_seq')
</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://blog.youkuaiyun.com/weixin_45611545/article/details/109156338