踩坑记录:Oracle 插入的数据出现丢失

18次阅读
没有评论

共计 1333 个字符,预计需要花费 4 分钟才能阅读完成。

内容目录

踩坑记录:Oracle 插入的数据出现丢失

前言

 众所周知,Oracle 是一个安全性非常高的数据库,与 MySQL 相比,有很多不一样的特性。由于公司项目用到了 Oracle,加上平时自己用 MySQL 比较多,因此,最近在 Oracle 上面踩了一个大坑,耗费我一天时间 Debug。

问题描述

 使用客户端工具创建一个 Query 窗口,执行查询语句:

SELECT * FROM WKD_R_TASKREMIND_ACCESS
WHERE LISTPAGE LIKE '%fixedRate%';

 查询结果有两条:

踩坑记录:Oracle 插入的数据出现丢失

 再执行一条插入语句:

insert into WKD_R_TASKREMIND_ACCESS (ID, TASKREMINDTYPEID, DEALACCESSPATHID, MENUDIRID, MENUMODULEID, LISTPAGE, LISTPAGETYPE, NUMBERSUMMODE, SQLMAPID)
values (29889022, 29889022, '000000000000000005861082051665772', '0000100020000022', '3027790634100002', 'settlement/query/fixedRate/pendingReview/list2', 2, null, null);

 再次查询,可以查询到 3 条数据

踩坑记录:Oracle 插入的数据出现丢失

到这,一般人(包括我)会以为插入成功了,实际不然。

 让我们重新开启一个 Query 窗口,执行查询语句:

踩坑记录:Oracle 插入的数据出现丢失

 只有两条,新增的数据并没有查询到。

问题分析

  • Oracle 采用手动提交事务机制,保证事务一致性,INSERT 后默认不会自动提交,必须 COMMIT
  • MySQL(默认 autocommit=ON)每个 INSERT 语句自动提交,无需 COMMIT,但如果关闭 autocommit,就需要 COMMIT

踩坑过程

  • 在我使用客户端执行插入语句后,对项目执行情况进行跟踪,查询到的数据始终没有新增的数据;
  • 然后我又对能查到的数据执行DELETE(同样的也没有COMMIT)发现程序还是能够查询到;
  • 我一度以为是数据库连接配置有问题,全局搜索jdbc.url对连接信息进行更改,项目运行还是出现一样的情况;
  • 然后我在项目查询之前使用 JDBC 手动执行 INSERT 语句,正常人肯定会想查询之前插入数据,可能能够查到,但实际上并没有,查询的数据仍然没有新增的数据:
statement.execute(insertSQL);
Result result = statement.execute(querySQL);
log(result) // result没有新增的数据
  • 咨询 DeepSeek:"Oracle 插入的数据 能够成功查询到数据 过一段时间后 又查不到了 分析下这种情况?" 回复:"服务器繁忙,请稍后再试"。咨询 DeepSeek*3
  • 问 GPT4,回复需要 COMMIT;然后又问"Oracle 执行 Insert 后需要 commit 吗?为什么 MySQL 不需要?"加深理解。

总结

 因为平时用 MySQL 比较多,所以 Oracle 的坑一踩一个准。。。后面需要抽时间单独了解下 Oracle 与 MySQL 的异同。

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2025-02-19发表,共计1333字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
踩坑记录:Oracle 插入的数据出现丢失

踩坑记录:Oracle 插入的数据出现丢失

众所周知,Oracle 是一个安全性非常高的数据库,与 MySQL 相比,有很多不一样的特性。由于公司项目用到了 Oracle,加上平时自己用 MySQL 比较多,因此,最近在 Oracle 上面踩了一个大坑,耗费我一天时间 Debug。