首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 查詢結果不一致排查實錄:一個遺漏 COMMIT 引發的「靈異事件」

     編輯:Oracle 教學

現象:同一張表,PL/SQL Developer 能查到資料,Linux 命令列卻查不到?

開發人員在 PL/SQL Developer 中向 tb_employeeinfo6 插入一筆資料,SELECT 確認成功。但過一段時間,在 Linux 伺服器上用 sqlplus 連線查詢同一張表,卻返回 0 筆資料。回到 PL/SQL Developer 再查,資料又在。資料是被刪除了嗎?還是遭遇了什麼「平行時空」?

環境與重現步驟

  • 資料庫:Oracle on Linux
  • 開發工具:PL/SQL Developer(Windows 客戶端)
  • 重現動作:
    1. 建立 10 張同結構表 tb_employeeinfo0~9 及對應存儲過程 pr_insertdata0~9
    2. 在 PL/SQL Developer 執行 pr_insertdata6('123456', 25, :ret)
    3. 工具中 SELECT * FROM tb_employeeinfo6 可見資料
    4. Linux 下 sqlplus user/pwd@db 同樣查詢 → 無資料

根因分析:存儲過程缺少 COMMIT

細閱存儲過程碼發現: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 查詢即可看到資料,問題解決。

核心知識點總結

  1. 交易隔離性:Oracle 預設 READ COMMITTED 隔離級別,一個會話的未提交變更對其他會話不可見。
  2. 工具行為差異:部分 GUI 工具(如 PL/SQL Developer、Toad)預設自動提交或提供「Auto Commit」選項,掩蓋了交易未提交的事實。
  3. 最佳實踐:存儲過程中執行 DML 後必須明確 COMMIT 或 ROLLBACK,不可依賴客戶端工具行為。
  4. 經驗傳承:資深 DBA 几分鐘定位問題,新手可能耗費數小時。遇到詭異現象,優先檢查交易提交狀態,並善用團隊經驗。

教訓:一個缺失的 COMMIT,讓資料在「提交前」與「提交後」兩個世界同時存在。嚴謹的交易控制,是資料一致性的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved