多使用者並發存取同一資料時,若無協調機制會產生四大經典問題:
鎖即透過限制資源存取權實現隔離,保證 ACID 特性。
| 層級 | 資源範圍 | 並發度 | 系統開銷 | 典型場景 |
|---|---|---|---|---|
| 列 | 單一資料列 | 最高 | 最大(鎖數量多) | OLTP 高頻點查詢/更新 |
| 頁 | 8 KB 頁(含多列) | 中 | 中 | 早期版本預設、範圍掃描 |
| 區 | 8 頁(64 KB) | 低 | 低 | 空間配置(建表、建索引) |
| 表 | 整張表 | 最低 | 最小(鎖數量少) | 大量資料載入、DDL、報表鎖表 |
| 資料庫 | 整個資料庫 | 無 | 極小 | 資料庫還原、單用戶模式維護 |
SQL Server 監控交易持有鎖數量,超過閾值(約 5,000 把鎖)自動將列/頁鎖升級為表鎖,降低記憶體壓力。閾值與升級行為由引擎自動決定,不可手動設定。設計啟示:大批次更新建議分批次提交,避免觸發升級導致並發急降。
| 模式 | 縮寫 | 相容性 | 用途 |
|---|---|---|---|
| 共享鎖 | S | 與 S、U 相容;與 X、BU 不相容 | SELECT 讀取(預設讀完即釋) |
| 更新鎖 | U | 與 S 相容;與 U、X、BU 不相容 | 修改前預鎖定,防止 S→X 升級死結 |
| 排他鎖 | X | 與所有鎖不相容 | INSERT/UPDATE/DELETE 寫入 |
| 結構穩定鎖 | Sch-S | 與除 Sch-M 外所有鎖相容 | 查詢編譯期間防止結構變更 |
| 結構修改鎖 | Sch-M | 與所有鎖不相容 | DDL 執行期間(加欄、建索引) |
| 大量更新鎖 | BU | 與 BU 相容;與 S、U、X 不相容 | BULK INSERT / bcp 配合 TABLOCK |
意圖鎖不阻塞資料操作,僅讓引擎快速判斷上層資源是否可加鎖,避免逐層掃描。
| 隔離等級 | 髒讀 | 不可重複讀 | 幻讀 | 鎖持有策略 |
|---|---|---|---|---|
| READ UNCOMMITTED | 允許 | 允許 | 允許 | 無共享鎖(NOLOCK) |
| READ COMMITTED | 禁止 | 允許 | 允許 | 讀取即釋放 S 鎖 |
| REPEATABLE READ | 禁止 | 禁止 | 允許 | 交易結束前保持 S 鎖 |
| SERIALIZABLE | 禁止 | 禁止 | 禁止 | 範圍鎖(Key-Range)防幻讀 |
| SNAPSHOT | 禁止 | 禁止 | 禁止 | 版本存儲,讀不阻寫、寫不阻讀 |
sp_lock / sys.dm_tran_locks:即時鎖快照。DBCC INPUTBUFFER(spid):查看阻塞/被阻塞 SPID 執行的 SQL 文本。Lock:Deadlock 圖形化分析死結鏈。鎖是 SQL Server 並發控制的基石。深入理解粒度、模式、升級與隔離等級的交互關係,才能在高並發環境下兼顧資料一致性與系統吞吐量。