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方法更新的数据,防止覆盖

相关推荐
C雨后彩虹15 小时前
任务最优调度
java·数据结构·算法·华为·面试
heartbeat..15 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X15 小时前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资
元Y亨H17 小时前
Nacos - 服务发现
java·微服务
麦聪聊数据17 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
微露清风17 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi022717 小时前
Java趣闻
java
AC赳赳老秦18 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
阿波罗尼亚18 小时前
Tcp SSE Utils
android·java·tcp/ip
susu108301891118 小时前
springboot3.5.8整合minio8.5.9
java·springboot