開發人員在 PL/SQL Developer 中向 tb_employeeinfo6 插入一筆資料,SELECT 確認成功。但過一段時間,在 Linux 伺服器上用 sqlplus 連線查詢同一張表,卻返回 0 筆資料。回到 PL/SQL Developer 再查,資料又在。資料是被刪除了嗎?還是遭遇了什麼「平行時空」?
tb_employeeinfo0~9 及對應存儲過程 pr_insertdata0~9pr_insertdata6('123456', 25, :ret)SELECT * FROM tb_employeeinfo6 可見資料sqlplus user/pwd@db 同樣查詢 → 無資料細閱存儲過程碼發現:INSERT 陳述式後未加 COMMIT。PL/SQL Developer 預設啟用「Auto Commit」或會話結束時隱性提交,因此工具內可見資料;但該交易在資料庫層面尚未提交,其他會話(如 Linux sqlplus 連線)依隔離級別無法讀取未提交資料。
在存儲過程 INSERT 後補上 COMMIT,重新建立過程 pr_insertdata9 並測試:
-- 修正後的關鍵片段
INSERT INTO tb_employeeinfo9(employeeno, employeeage) VALUES(v_employeeno, v_employeeage);
COMMIT; -- 關鍵:明確提交交易
再次在 PL/SQL Developer 插入測試資料,Linux 端 sqlplus 查詢即可看到資料,問題解決。
教訓:一個缺失的
COMMIT,讓資料在「提交前」與「提交後」兩個世界同時存在。嚴謹的交易控制,是資料一致性的基石。