共計 2002 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章主要介紹“SQLServer 臟讀方式數據怎么提取”,在日常操作中,相信很多人在 SQLServer 臟讀方式數據怎么提取問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SQLServer 臟讀方式數據怎么提取”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
在設計數據庫應用時,你應該記住各種不同類型的鎖及事務發生的不同隔離級別。通常情況下,SQLServer 默認方式能夠很好地完成你要使用的功能,不過,有些時候利用 SQL 語句在數據表上手工添加關于鎖是如何應用的提示信息將是十分有用的。
本文主要介紹了兩種數據表提示:NOLOCK 和 READPAST。我們將建立一個數據表用作例子中的查詢數據表。執行列表 A 中的腳本建立一個 SalesHistory 數據表并添加一些數據。
NOLOCK
該數據表提示,也稱為 READUNCOMMITTED,只能用于 SELECT 語句。NOLOCK 表明沒有對數據表添加共享鎖以阻止其它事務對數據表數據的修改。
該語句的好處是它可以使數據庫引擎不用在處理查詢中的上鎖問題,可以提高并發性并改善數據庫性能,因為數據庫引擎不用在維護共享鎖的使用問題。存在的問題是因為該語句不能處理要讀取的數據表的所有鎖,所以一些“臟數據”或未被提交的數據潛在的可能被讀取。
假如某個事務被滾回,那么應用了 NOLOCK 連接的數據讀取操作將可以讀取未提交的數據。這種類型的讀取導致處理的不一致性會帶來很多問題。這是你使用 NOLOCK 時應該了解的技巧。
作為一個負面影響,NOLOCK 查詢還可能帶來讀取“幻影”數據或讀取在一個數據庫讀取事務中可以獲得的但在另一個事務中可能被滾回的數據的風險。(我將在本系列文章的第二部分對這個負面影響進行詳細說明。)
下面的例子展示了 NOLOCK 如何工作以及臟數據讀取是如何產生的。在下面的腳本中,我用一個事務在 SalesHistory 數據表中插入一條記錄。
SQLServer 臟讀方式數據怎么提取之 NOLOCK 和 READPAST
BEGINTRANSACTIONINSERTINTOSalesHistory(Product,SaleDate,SalePrice)VALUES(PoolTable ,GETDATE(),500)
這個事務仍舊是開放的,這意味著仍可以對插入數據表的記錄上鎖以阻止其它操作。在一個新的查詢窗口中,運行下面的腳本,該腳本使用 NOLOCK 數據表提示返回 SalesHistory 數據表中的記錄數。
SELECTCOUNT(*)FROMSalesHistoryWITH(NOLOCK)
返回記錄數值為 301。因為對 SalesHistory 數據表插入記錄的事務還沒有提交,所以我們可以撤銷它。我通過使用下面的語句將事務滾回:
ROLLBACKTRANSACTION
該語句從 SalesHistory 數據表中刪除前面插入的記錄。現在我們運行前面運行的同樣的 SELECT 語句。
SELECTCOUNT(*)FROMSalesHistoryWITH(NOLOCK)
這次返回記錄數的值為 300。我第一次查詢讀記錄的事務還沒有提交,這就是一個臟數據讀取。
READPAST
這是一個比 NOLOCK 較少使用的數據表提示。這個提示指明數據庫引擎返回結果時忽略加鎖的行或數據頁。
這個數據表提示的優點和 NOLOCK 一樣,在處理查詢時不會發生阻塞。此外,讀臟數據并不會出現在 READPASTA 中,因為不會返回鎖定的記錄。這個語句的缺點是,因為不返回鎖定的記錄,所以很難確定結果集或修改語句是否包含所有必須的記錄。在你的應用中可能需要添加一些邏輯來確保最終包含所有必須的記錄。
READPAST 數據表提示的例子和 NOLOCK 的例子類似。我將使用一個事務來更新 SalesHistory 數據表中的一個記錄。
BEGINTRANSACTIONUPDATETOP(1)SalesHistorySETSalePriceSalePrice=SalePrice+1
因為我沒有提交或回滾這個事務,所以添加在更新記錄上的鎖仍舊有效。在一個新的查詢編輯窗口中,運行下面的腳本,該腳本對 SalesHistory 數據表使用 READPAST 統計表中的記錄數。
SELECTCOUNT(*)FROMSalesHistoryWITH(READPAST)
最初 SalesHistory 數據表中包含 300 條記錄,UPDATE 語句正鎖定表中一條記錄,所以上面使用 READPAST 的腳本返回結果為 299 條記錄,這說明我要更新的記錄被鎖定,所以被 REASPAST 提示忽略。
到此,關于“SQLServer 臟讀方式數據怎么提取”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!