📘 SQL Server 常用 WITH (Hint) 用法與組合場景對照表
Hint 組合 | 作用說明 | 常見用途 | 是否阻塞他人 | 是否讀臟數據 | 備注 |
---|---|---|---|---|---|
WITH (NOLOCK) | 不加共享鎖,允許讀取未提交數據 | 報表導出、大數據分頁 | ? | ? | 等價于 READ UNCOMMITTED,臟讀風險高 |
WITH (HOLDLOCK) | 保持共享鎖直到事務結束(默認讀鎖是讀完就釋放) | 需要防止幻讀、讀取一致性要求高 | ?(讀鎖) | ? | 類似 SERIALIZABLE,讀一致性好 |
WITH (UPDLOCK) | 讀取時申請更新鎖,防止其他事務更新 | “先查后改”場景,避免并發寫沖突 | ?(寫鎖) | ? | 常用于檢查數據是否存在后決定更新插入 |
WITH (XLOCK) | 獨占鎖,阻止其他事務讀寫 | 強一致性要求操作(如刪除、強制改) | ?(全鎖) | ? | 不建議長時間持有,影響并發 |
WITH (TABLOCK) | 表級共享鎖,鎖住整張表 | 全表掃描、導出 | ?(整表) | ? | 讀期間禁止別人寫 |
WITH (TABLOCKX) | 表級獨占鎖,整表禁止讀寫 | 初始化數據、清空、批量更新 | ?(強封鎖) | ? | 通常配合事務短時間使用 |
WITH (ROWLOCK) | 強制使用行鎖,避免鎖升級為頁/表鎖 | 高頻并發插入、更新 | ?? 取決于語句 | ? | 僅做鎖粒度建議,SQL Server 可忽略 |
WITH (PAGLOCK) | 盡量使用頁鎖,適合中等范圍更新 | 分批更新大量記錄 | ?? 取決語句 | ? | 少見,不如 ROWLOCK 常用 |
WITH (INDEX(IndexName)) | 強制使用某個索引執行計劃 | 優化器走錯索引時手動糾正 | 不影響鎖行為 | ? | 不影響鎖,僅影響執行路徑 |
WITH (FORCESEEK) | 強制走索引查找路徑 | 優化器自動選擇表掃描導致性能低 | 不影響鎖行為 | ? | 通常用于調優大型表的慢查詢 |
WITH (FORCESCAN) | 強制走全表掃描 | 與 FORCESEEK 相反 | 不影響鎖行為 | ? | 不推薦使用,除非確認 seek 更慢 |
WITH (NOEXPAND) | 不展開視圖,直接使用物化索引視圖 | 使用 Indexed View 時保持優化器使用索引 | 不影響鎖行為 | ? | 僅對物化視圖有效,需特權支持 |
WITH (READCOMMITTED) | 強制使用已提交讀 | 顯式指定默認隔離級別 | ? | ? | 和默認行為一致 |
WITH (READUNCOMMITTED) | 等價于 NOLOCK,允許臟讀 | 報表、快照、對一致性容忍的數據訪問 | ? | ? | 用法不同但含義一致 |
? 常見 Hint 組合推薦(按場景)
組合 Hint | 用途場景 | 描述說明 |
---|---|---|
WITH (NOLOCK) | 報表分頁、大量讀取 | 快速不阻塞,但可能臟讀 |
WITH (UPDLOCK, HOLDLOCK) | 先查再更 | 避免“查完數據被別人改了” |
WITH (ROWLOCK, UPDLOCK) | 并發更新,防止鎖沖突 | 精細控制鎖粒度,避免鎖升級 |
WITH (XLOCK, ROWLOCK) | 強制對每行加獨占鎖 | 限制讀寫并發,適合關鍵操作 |
WITH (TABLOCKX) | 初始化、清空整表 | 封鎖全表,強一致但需快速提交事務 |
WITH (INDEX(...), NOLOCK) | 快速讀取指定索引 | 加快查詢且不加鎖,臟讀風險存在 |
WITH (FORCESEEK, HOLDLOCK) | 精確讀取 + 保證一致性 | 強制走索引 + 鎖住讀取數據 |
WITH (NOEXPAND) | 保持 Indexed View 性能 | 避免視圖被展開為普通查詢 |
?? 使用注意事項
- 多個 Hint 用英文逗號隔開,如:
SELECT * FROM MyTable WITH (UPDLOCK, HOLDLOCK, ROWLOCK)
先查后改 — 避免“幻讀”和臟寫
BEGIN TRAN;SELECT Quantity
FROM Inventory WITH (UPDLOCK, HOLDLOCK)
WHERE ProductID = 1001;-- 假設庫存充足,執行扣減
UPDATE Inventory
SET Quantity = Quantity - 1
WHERE ProductID = 1001;COMMIT TRAN;
批量刪除數據時鎖表保護
BEGIN TRAN;DELETE FROM Orders WITH (TABLOCKX)
WHERE OrderDate < '2020-01-01';COMMIT TRAN;
強制使用索引加快查詢
SELECT OrderID, OrderDate
FROM Orders WITH (INDEX(IX_Orders_OrderDate))
WHERE OrderDate > '2025-01-01';
控制鎖粒度,避免鎖升級
UPDATE Products WITH (ROWLOCK, UPDLOCK)
SET Stock = Stock - 10
WHERE ProductID = 1234;
查詢某條記錄時保持鎖直到事務結束,防止臟寫
BEGIN TRAN;SELECT * FROM Accounts WITH (HOLDLOCK, ROWLOCK)
WHERE AccountID = 5678;-- 處理業務邏輯UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 5678;COMMIT TRAN;
復雜聯表查詢時,指定索引和讀未提交
SELECT o.OrderID, c.CustomerName
FROM Orders o WITH (NOLOCK, INDEX(IX_Orders_CustomerID))
JOIN Customers c WITH (NOLOCK)
ON o.CustomerID = c.CustomerID
WHERE o.OrderDate > '2025-01-01';
防止死鎖,鎖定行用于更新
BEGIN TRAN;SELECT * FROM Inventory WITH (UPDLOCK, ROWLOCK)
WHERE ProductID = 789;-- 執行更新
UPDATE Inventory
SET Quantity = Quantity - 5
WHERE ProductID = 789;COMMIT TRAN;
示例編號 | 場景描述 | 使用 Hint |
---|---|---|
1 | 報表快速查詢 | NOLOCK |
2 | 庫存扣減防止超賣 | UPDLOCK, HOLDLOCK |
3 | 批量刪除防止并發訪問 | TABLOCKX |
4 | 索引優化查詢 | INDEX(索引名) |
5 | 精確鎖粒度控制 | ROWLOCK, UPDLOCK |
6 | 賬戶資金變更防臟寫 | HOLDLOCK, ROWLOCK |
7 | 聯表查詢+索引+不阻塞 | NOLOCK, INDEX(...) |
8 | 防止更新死鎖 | UPDLOCK, ROWLOCK |
為什么用多個鎖提示?比如 UPDLOCK + HOLDLOCK
UPDLOCK
的作用
只在讀取這條數據時加更新鎖(一種介于共享鎖和排他鎖的鎖)。
更新鎖允許其他事務讀取,但阻止其他事務獲得寫鎖。
這防止了兩個事務同時讀取后,都去更新數據造成沖突。
HOLDLOCK
的作用
默認情況下,鎖在語句結束時釋放(例如,SELECT 語句讀完馬上釋放共享鎖或更新鎖)。
加了 HOLDLOCK,會將鎖保持到整個事務結束,防止其他事務在當前事務未提交前修改數據。
這樣可以避免“不可重復讀”和“幻讀”問題。
BEGIN TRAN;SELECT Quantity
FROM Inventory WITH (UPDLOCK, HOLDLOCK)
WHERE ProductID = 1001;-- 這里做業務判斷,比如庫存是否足夠
IF @quantity > 0
BEGINUPDATE InventorySET Quantity = Quantity - 1WHERE ProductID = 1001;
ENDCOMMIT TRAN;
如果只有 UPDLOCK,SELECT 語句結束后,鎖就釋放了,后續操作可能會被其他事務修改。
如果只有 HOLDLOCK,它是共享鎖,會阻止寫,但無法阻止其他事務讀取并加更新鎖,存在寫寫沖突風險。
兩者結合,讀的時候加更新鎖,且保持鎖直到事務結束,保證了安全性。
本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。 如若轉載,請注明出處:http://www.pswp.cn/web/86056.shtml 繁體地址,請注明出處:http://hk.pswp.cn/web/86056.shtml 英文地址,請注明出處:http://en.pswp.cn/web/86056.shtml
如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!相關文章
KES數據庫部署工具使用
一、啟動部署工具
Windows系統
#命令行
${安裝目錄}/ClientTools/guitools/DeployTools/deploy.exeLinux系統
#命令行
[rootnode ~]# ${安裝目錄}/ClientTools/guitools/DeployTools/deploy二、環境配置
1.硬件要求
#都是最小配置
CPU:主流32或64位
內存&#…
TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器
TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器。該器件采用BiCD工藝制造,額定電壓為40伏/1.0安培。片上電壓調節器允許使用單一VM電源控制步進電機。
特點:
? 雙極性步進電機驅動器
? 脈沖寬度調制(PWM…
uni-app項目實戰筆記24--uniapp實現圖片保存到手機相冊
前提條件:微信小程序要想實現保存圖片到本地相冊需要到微信公眾平臺--小程序--開發管理中配置服務器域名中的downloadFile合法域名: \uniapp提供了saveImageToPhotosAlbum API實現保存的圖片到本地相冊。下面是它的配置參數:
參數名類型必填…
面試題-定義一個函數入參數是any類型,返回值是string類型,如何寫出這個函數,代碼示例
在 TypeScript 里,要定義一個入參為any類型、返回值為string類型的函數,可參考下面幾種實現方式:
1. 基礎實現
直接把入參轉換為字符串返回。
function anyToString(input: any): string {return String(input); // 使用String()進行類型轉…
TensorFlow深度學習實戰——Transformer模型評價指標
TensorFlow深度學習實戰——Transformer模型評價指標 0. 前言1. 質量1.1 GLUE1.2 SuperGLUE1.3 SQuAD1.4 RACE1.5 NLP-progress2. 參數規模3. 服務成本相關鏈接0. 前言
可以使用多種類型的指標評估 Transformer 模型。在本節中,我們將學習一些用于評估 Transformer 的關鍵因素…
linux內核學習(一)---內核社區介紹及補丁提交
目錄
一、引言
二、內核源碼
三、內核社區
------>3.1、社區的組織架構
------>3.2、內核社區的工作方式
------>3.3、內核社區核心網站
------------>3.3.1、Linux Kernel 官網
------------>3.3.2、Linux Kernel 郵件列表(LKML)
------------>3.3…
輕量級web開發框架之Flask web開發框架學習:get請求數據的發送
Flask是一個使用 Python 編寫的輕量級 Web 應用框架,簡介靈活,可快速構建開發框架。 協作流程示例
客戶端請求 → Web服務器(Nginx) → WSGI服務器(Gunicorn/uWSGI)↓WSGI協議傳遞請求數據(env…
Vue 3 異步三劍客:Suspense、async setup() 和 await 的戲劇性關系,白屏的解決
文章目錄 🎭 Vue 3 異步三劍客:Suspense、async setup() 和 await 的戲劇性關系,白屏的解決🎬 角色介紹🎭 正常演出流程(有 Suspense 時)💥 災難場景(缺少 Suspense 時&a…
【JavaScript-Day 48】告別 Ajax,擁抱現代網絡請求:Fetch API 完全指南
Langchain系列文章目錄
01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…
BUUCTF在線評測-練習場-WebCTF習題[極客大挑戰 2019]Knife1-flag獲取、解析
解題思路
這題沒有什么解題思路,打開靶場,標題是白給的shell 頁面顯示了
eval($_POST["Syc"]); 這是php webshell命令,密碼為Syc,可直接通過該命令連接,根據標題提示,直接嘗試用蟻劍連接 連接成…
Qt—(Qt線程,Qt進程,,QT與sqlite數據庫)
一 Qt線程與進程概述 線程與進程對比 特性線程 (QThread)進程 (QProcess)內存空間共享父進程內存獨立內存空間創建開銷小 (幾MB)大 (幾十MB)通信方式共享內存/信號槽管道/套接字/文件崩潰影響導致整個進程終止僅自身終止適用場景高并發任務、計算密集型隔離第三方應用、安全需求…
計算機視覺階段一:CV入門基礎
目錄
學習目標:
一、核心知識點
二、實用工具推薦
三、學習內容與步驟
1.環境搭建
2.圖像獲取與顯示
3 圖像基礎處理
4 圖像幾何變換
5 圖像像素操作
四、實戰任務建議
實戰 1:圖像加載 顯示 保存
實戰 2:灰度圖 邊緣檢測 圖…
新增MCP接入和AutoAgent,漢得靈猿AI中臺1.6版正式發布!
漢得靈猿(大圣)AI中臺1.6版本,經過數月迭代,現已正式發布!
新版本最被期待的新功能,無疑是4月份預告的MCP接入,而令人同樣激動的另一項新功能,則是AutoAgent動態規劃智能體。除了兩…
文件鎖的藝術:深入解析 `fcntl(F_SETLK/F_GETLK)`
引言:在共享資源時代守護數據一致性
在多進程/多線程的應用場景中,文件作為一種共享資源常常面臨被并發訪問的挑戰。想象一個數據庫系統,多個客戶端可能同時嘗試修改同一數據文件;或者一個配置文件,需要確保在更新時不…
一個免費的視頻、音頻、文本、圖片多媒體處理工具
大家好,我是小悟。
給大家推薦一款可以免費使用的視頻、音頻、文本、圖片處理工具,名字叫百創工坊,不用下載,不用注冊,有免費的用就趕緊薅吧。 視頻工具 提取音頻:從視頻中提取音頻文件,支持多…
在 ef core 中操作復雜類型的序列化和反序列化時,如何全局設置 utf-8 編碼避免中文字符被轉義?
我們在使用 Entity Framework Core(EF Core) 時,如果希望 全局設置 JSON 序列化和反序列化使用 UTF-8 編碼,通常需要配置 System.Text.Json 的默認行為,因為 EF Core 6.0 及以上版本默認使用 System.Text.Json 進行 JS…
WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)
WPF CommunityToolkit.Mvvm 中的 ObservableRecipient
是什么?
ObservableRecipient 是 .NET Community Toolkit MVVM 庫中的一個核心類,繼承自 ObservableObject。它專為 WPF 應用設計,提供以下核心功能:
基礎數據綁定支持&am…
《C++》命名空間簡述
文章目錄 一、命名空間定義二、訪問命名空間內的成員三、標準命名空間:std四、嵌套命名空間 一、命名空間定義
在C中,命名空間(namespace)是一種將標識符分組的機制,用于避免重命名。例如:
int a 3;int main()
{int a 0;print…
【路徑規劃】基于Matlab的改進RRT算法二維/三維路徑規劃
基于Matlab的改進RRT算法二維/三維路徑規劃
一、引言
在機器人學、自動駕駛等領域,路徑規劃是一個關鍵問題,它旨在為機器人或車輛找到一條從起始點到目標點的安全、高效的路徑。RRT(Rapidly-exploring Random Trees)算法作為一種…