共计 1333 个字符,预计需要花费 4 分钟才能阅读完成。
内容目录
踩坑记录:Oracle 插入的数据出现丢失
前言
众所周知,Oracle 是一个安全性非常高的数据库,与 MySQL 相比,有很多不一样的特性。由于公司项目用到了 Oracle,加上平时自己用 MySQL 比较多,因此,最近在 Oracle 上面踩了一个大坑,耗费我一天时间 Debug。
问题描述
使用客户端工具创建一个 Query 窗口,执行查询语句:
SELECT * FROM WKD_R_TASKREMIND_ACCESS
WHERE LISTPAGE LIKE '%fixedRate%';
查询结果有两条:
再执行一条插入语句:
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 条数据
到这,一般人(包括我)会以为插入成功了,实际不然。
让我们重新开启一个 Query 窗口,执行查询语句:
只有两条,新增的数据并没有查询到。
问题分析
- 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 的异同。
正文完