對一些相對不怎么敏感的數據,不需要太及時性的數據,不需要占鎖。
要在SQL Server中執行查詢而不占用鎖,可以采取以下幾個策略:
1、使用NOLOCK提示: 最直接但風險較高的方法是在查詢中使用WITH (NOLOCK)提示。這樣,SQL Server會在讀取數據時不獲取共享鎖,從而避免阻塞其他事務的寫操作。但是,這可能導致讀取“臟讀”(未提交的數據)或重復讀取(因并發修改而被刪除或更改的數據)。因此,這個選項通常僅推薦用于只讀查詢,尤其是報表或數據分析場景,并且能接受數據可能不完全準確的風險。
SELECT * FROM YourTable WITH (NOLOCK)
此策略不要認為數據庫庫不會產生任何鎖。實質上,使用了WITH(NOLOCK)后,數據庫依然對該表對象生成Sch-S(架構穩定性)鎖以及DB類型的共享鎖,不要認為不會被其它會話阻塞,依然可能會產生Schema Change Blocking
2、 快照隔離級別: 更安全的做法是將數據庫或會話的事務隔離級別設置為快照隔離(SNAPSHOT)。在快照隔離下,查詢不會阻塞其他事務,也不會被其他事務阻塞,因為每個事務看到的是數據的一個快照版本,而不是實際的行鎖。不過,這會增加版本存儲的需求。設置會話級別的快照隔離:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
3、 使用READ_COMMITTED_SNAPSHOT: 啟用數據庫的READ_COMMITTED_SNAPSHOT選項,使得在讀取已提交隔離級別下執行的查詢也能像快照隔離一樣不阻塞。這樣可以在不改變應用程序代碼的情況下減少鎖爭用。?
實際我傾向于使用第二種策略?