資料庫並行存取是引擎設計的核心挑戰。SQL Server 與 Oracle 雖同為主流商用資料庫,但對並行控制採取了截然不同的鎖定策略,直接影響效能與應用開發模式。
多使用者同時查詢同一資料時,現代資料庫皆能透過多執行緒機制高效處理。複雜度在於「修改資料」時:資料庫必須確保同一時間僅一使用者能修改特定資料,並決定其他想「讀取」該資料的使用者該如何處理。SQL Server 與 Oracle 在此採取不同方案。
當使用者開始修改資料,SQL Server 立即鎖定該資料,**封鎖所有其他存取(含查詢)**,直到交易提交或回滾。示範:在 pubs 資料庫開啟交易更新書價但未提交,另一視窗查詢 titles 資料表將無限等待,即使查詢條件未涉及被修改的那一列,因預設隔離等級下讀取也會被封鎖。
此策略簡單但可能降低並行度。鎖定時間越長、範圍越大,等待的查詢越多。SQL Server 7.0 引入列級鎖定,僅鎖定實際修改的列;若一次修改多列,可能升級為頁或表鎖以減少鎖管理開銷。開發時應盡量縮短交易、縮小範圍。
Oracle 採用「讀不阻寫,寫不阻讀」的 MVCC 架構。修改時建立資料的新版本,查詢者讀取交易開始時的舊版本(一致性讀),不被封鎖。唯有「寫寫衝突」才會等待。這使 Oracle 在高並發讀取場景下表現優異,但需管理 Undo 區段與版本清理。
READ COMMITTED SNAPSHOT 隔離等級啟用行版本控制緩解封鎖。sp_lock, DMV; Oracle: V$LOCK, AWR)進行調優。