交易是 Oracle 保障資料一致性的核心機制(ACID)。透過 COMMIT 與 ROLLBACK,將多步驟操作視為不可分割的單元。然而,設計不良的交易會造成嚴重的鎖衝突,拖垮並發效能。本文歸納四大指導原則,助您撰寫高效能交易程式碼。
指導原則一:最小化存取記錄數 — 從「量」減少鎖衝突
- 交易執行
UPDATE/DELETE 時,Oracle 會對受影響列加排他鎖 (TX),其他會話嘗試修改同列會等待。
- 精準撰寫
WHERE 子句,理想目標是「一對一」精確定位,避免全表掃描或大範圍鎖定。
- 實務建議:前端應用加入業務篩選條件(如依產品分類分批盤點),將單次交易鎖定範圍控制在最小集合。
指導原則二:保持交易簡潔短小 — 從「時間」減少鎖持有期
- 鎖持有時間 = 交易執行時間。交易越複雜、SQL 越多,鎖定資源越久,阻塞風險指數級上升。
- 拆分大型交易:若需更新多欄位且資料量大,考慮分多個小交易逐欄位更新,或排程至離峰時段執行。
- 原則:確認需修改資料後才
BEGIN TRANSACTION,最短時間內完成 DML,立即 COMMIT/ROLLBACK。
指導原則三:交易期間禁止等待使用者輸入
- 人機交互速度遠慢於資料庫處理速度。若交易中需等待使用者按鍵、確認,鎖將被長期佔用(可能數分鐘至數小時)。
- 錯誤模式:使用者開啟修改視窗即啟動交易 → 使用者慢慢填寫 → 送出才 COMMIT。
- 正確模式:使用者完成所有輸入、點擊「確定送出」按鈕後,才在後端啟動交易執行 DML 並立即提交。
指導原則四:瀏覽/分析階段不開啟交易
- 使用者大部分時間用於查詢、篩選、審核、思考,實際修改動作極短。
- 僅在使用者點擊「更新/儲存」按鈕、所有參數已備妥時,才開啟交易。
- 事後審核、報表匯出等唯讀操作,絕不應在交易中進行。
補充技巧
- 隔離等級:非必要不使用
SERIALIZABLE,預設 READ COMMITTED 通常足夠並發更好。
- 部分回滾:善用
SAVEPOINT 實現部分回滾,避免全交易重跑。
- 排他鎖副作用:修改資料隱含排他鎖至提交/回滾為止,務必在最晚時機才取得鎖、最早釋放。
總結對照表
| 原則 | 核心動作 | 降低風險 |
| 最小化記錄 | 精準 WHERE、分批處理 | 鎖衝突機率 |
| 簡潔短小 | 拆分長交易、離峰執行 | 鎖持有時間 |
| 無使用者等待 | 前端收齊參數再啟動交易 | 不可預期的長鎖定 |
| 瀏覽不開交易 | 唯讀操作零交易 | 無謂資源佔用 |
遵循四大原則,配合適當隔離等級與鎖監控,可顯著提升 Oracle 高並發環境下的交易吞吐與回應速度。