SELECT * FROM table WITH (HOLDLOCK)
行為:持有共享鎖直到交易結束,等同 SERIALIZABLE 隔離等級。
並發影響:其他交易可讀取資料表,但無法更新/刪除。
SELECT * FROM table WITH (TABLOCKX)
行為:在整個資料表上施加排他鎖直到命令或交易結束。
並發影響:其他交易無法讀取、更新、刪除資料表,完全封鎖。
| 提示 | 中文名稱 | 鎖類型 | 持有期間 | 並發影響 | 對應隔離等級 |
|---|---|---|---|---|---|
| NOLOCK | 不加鎖 | 無 | 語句執行期間 | 允許髒讀 | READ UNCOMMITTED |
| HOLDLOCK | 保持鎖 | 共享鎖 | 交易結束 | 可讀、不可寫 | SERIALIZABLE |
| UPDLOCK | 更新鎖 | 更新鎖 | 交易/命令結束 | 可同時讀、單一寫 | - |
| TABLOCK | 資料表鎖 | 共享鎖 | 命令結束 | 可讀、不可寫 | - |
| PAGLOCK | 頁面鎖 | 共享頁鎖 | 預設行為 | - | - |
| TABLOCKX | 排他資料表鎖 | 排他鎖 | 命令/交易結束 | 完全封鎖 | - |
| ROWLOCK | 列鎖 | 強制列鎖 | - | 粒度最細 | - |
| READPAST | 跳過鎖定列 | - | - | 跳過 RID 鎖 | READ UNCOMMITTED |
SELECT * FROM table WITH (HOLDLOCK) -- 其他交易可讀,不可更新刪除
SELECT * FROM table WITH (TABLOCKX) -- 其他交易不可讀,不可更新刪除