jdbcTemplate执行sql后数据库字段没有更新问题解决

问题大致如下:

postgre数据库,jsonb字段,由于mapper层用的是mybatis,而mybatis的JSQLParser无法解析mapper.xml文件中的jsonb更新语法,所以无法直接用sql更新jsonb字段中的json内容,于是我使用jdbcTemplate执行原生sql来更新这个字段的值。

问题是:显示执行成功,但是字段置未被更新。但我把日志中的sql和参数拿去dbever执行都可以正确更新字段值,但是偏偏在项目中无法正确更新,也不报错,原生sql执行也没问题,也正确返回了影响行数,但数据库的字段就是没有变化。

问题原因:

我的调用顺序:1.mapper.update();2.原生sql;这个调用顺序导致了问题出现,原因是我在第一步调用mapper.update的时候,虽然执行成功,但数据库事务尚未提交,也就是说,更新只存在于mybatis的一级缓存中,并未真实发生在数据库。而我的第二个原生SQL并未被mybatis事务管理器管理,直接绕过了管理器在数据库发生了真实变更。而当原生sql执行完,第一步的mapper.update方法的事务才被提交,此时一级缓存中的旧值覆盖了我原生SQL修改过的值,所以出现了这个问题。

解决办法:

1.先执行原生SQL,再执行mybatis方法

2.执行完原生SQL后,需要重新查询一下待mybatis方法更新的数据,防止覆盖

相关推荐
2501_918126914 分钟前
学习所有6502写游戏控制器的语句
java·linux·网络·汇编·嵌入式硬件
未来龙皇小蓝10 分钟前
【MySQL-索引调优】09:Order By相关概念
数据库·mysql·性能优化
未来龙皇小蓝13 分钟前
【MySQL-索引调优】10:常见的分页优化处理
数据库·mysql·性能优化
God__is__a__girl17 分钟前
Oracle驱动版本引发ORA-01461批量插入异常排查与解决
数据库·oracle
青春易逝丶22 分钟前
策略模式
java·开发语言·策略模式
少年攻城狮28 分钟前
Oracle系列---【两个环境,表结构一致,数据量一致,索引也一致,为什么同样的sql执行时间却不一致?】
数据库·sql·oracle
l1t28 分钟前
解决用docker安装umbra数据库遇到的FATAL:Operation not permitted错误
数据库·docker·容器
贼爱学习的小黄31 分钟前
NC BIP参照开发
java·前端·nc
小江的记录本35 分钟前
【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件
java·前端·spring boot·后端·sql·tomcat·mybatis
小张会进步35 分钟前
数组:二维数组
java·javascript·算法