nolock的用法你知道啵

    今天在排查問題的過程中,看見開發在存儲過程有查詢語句使用了with(nolock) 關鍵字。藉此我也想了解這個函數的用途。

先說下概念:提升SQL查詢效能,多數會以建索引(index)爲首要考慮,其實還有一個改善的語法:在表後加nolock或with(nolock),目的是查詢不鎖表,提高查詢速度,減少數據庫Dead Lock。

缺點:1: 產生髒讀 2: 只適用select查詢語句。

優點:部分資料證明,加了with(nolock)的sql查詢效率可增加33%。

可以用於inner join語句。

SELECT COUNT(UserID) 

FROM EMPLOYEE WITH (NOLOCK) 

JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID

補充下nolock引起的相關的其他幾種數據讀取的名詞解釋--

關於髒讀(Dirty Read)解釋:不同用戶,第一個正在對某資源進行修改,同時第二個用戶正好讀取第一個用戶修改後的數據,但第一個用戶放棄修改,數據回到修改之前,不同的返回結果造成髒讀。

不可重複讀:這裏涉及到事務,當一個用戶操作的是一個事務,這個事務分兩次讀取同一條記錄,如果第一次讀取完畢,有另外一用戶修改了這個數據,這時第一個用戶讀取的是第二個用戶修改後的數據,如果事務中加鎖可以避免。

幻讀:當用戶讀取一批數據,用戶查詢同一條件的一批記錄,如果第一次查詢完畢,其他用戶對這批數據進行修改,刪除,新增;當他第二次查詢時,會發現第一次查詢的記錄條目不在第二次查詢的數據集中,或者第二次查詢的數據未出現在第一次查詢的結果集中,由此引發幻讀。

鎖:每個事務對所依賴的資源會請求不同類型的鎖,可阻止其他事務因某種可能導致事務請求鎖出錯的方式修改資源。當事務不再依賴鎖定的資源時,鎖將被釋放。根據不通過的鎖類型可劃分:

表類型:鎖定整個表 。行類型:鎖整個表 。文件類型:鎖定某個數據庫文件。 數據庫類型:鎖整個數據庫。 頁類型:鎖定8K爲單位的數據庫頁。 根據用戶和數據庫對象劃分
 

共享(S):不更改,不更新數據庫(只讀操作),常見select語句,這個用的較多。

更新(U):用於可更新資源中,防止當多個會話在讀取,鎖定以及資源更新時發生常見的死鎖。

排它(X):用於數據修改操作,如insert,update或delete,避免同一時間進行資源多重更新。

小結(建議--- 如果項目中的每個查詢都加上一句with(nolock)是不科學的,而且很浪費時間,可怕的會出現技術漏洞,最好使用行版本控制。一般數據量特別大的表,犧牲數據安全性來提升性能是可以考慮的。允許出現髒數據現象的業務邏輯,數據不經常修改的表,這個可以考慮,金融行業還是少用爲好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章