在sqlserver中,對數據量不斷膨脹的表,隨時間的推移,數據會越來越多。
從而查詢會越來越慢,影響程序性能。
在允許臟讀的情況下,我們可以使用WITH(NOLOCK)避免鎖定數據,提升查詢性能。
臟讀的即可能是在事務中執行(增刪改),但未提交的數據,該數據后面可能被事務回滾。
例:select * from MyTable with(nolock)
解讀:
1.當我們在執行select操作時,會對MyTable 加上共享鎖。也就是此時我們對MyTable 表只能執行讀取操作。
在表名后加上with(nolock),即表明不會對表加任何鎖。
2.若我們對MyTable 執行insert,update,delete操作時,這三類操作都會對MyTable表加上排他鎖,
即這類操作執行時,其他操作必須等待。此時若在事務中存在此類操作,加上with(nolock)的查詢操作就會出現臟讀。
場景:
若我們程序在select大數據量表時,此時查詢時間較長,若同時程序其他地方也對該表進行insert,update,delete操作時,
就會排隊等待select執行結束,當等待時間超過默認時間,該操作就會因為等待超時而失敗。
處理:
加上with(nolock)可不受鎖影響,直接讀取數據。
Do you remember when we were two beautiful birds? We would
light up the sky when we'd fly....