日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SQLServer臟讀方式數(shù)據(jù)提取--NOLOCK和READPAST

對數(shù)據(jù)庫中的數(shù)據(jù)進行讀操作或修改時,數(shù)據(jù)庫引擎使用專門的控制類型來保持數(shù)據(jù)庫的完整性,稱為鎖機制。鎖機制通過確保包含在一個事務中的數(shù)據(jù)庫記錄在該事務提交之前不能被其它事務修改來保證數(shù)據(jù)庫的一致性。

成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元興海做網(wǎng)站,已為上家服務,為興海各地企業(yè)和個人服務,聯(lián)系電話:18980820575

在設(shè)計數(shù)據(jù)庫應用時,你應該記住各種不同類型的鎖及事務發(fā)生的不同隔離級別。通常情況下,SQL Server默認方式能夠很好地完成你要使用的功能,不過,有些時候利用SQL語句在數(shù)據(jù)表上手工添加關(guān)于鎖是如何應用的提示信息將是十分有用的。

本文主要介紹了兩種數(shù)據(jù)表提示:NOLOCK和READPAST。我們將建立一個數(shù)據(jù)表用作例子中的查詢數(shù)據(jù)表。執(zhí)行列表A中的腳本建立一個SalesHistory數(shù)據(jù)表并添加一些數(shù)據(jù)。

NOLOCK

該數(shù)據(jù)表提示,也稱為READUNCOMMITTED,只能用于SELECT語句。NOLOCK表明沒有對數(shù)據(jù)表添加共享鎖以阻止其它事務對數(shù)據(jù)表數(shù)據(jù)的修改。

該語句的好處是它可以使數(shù)據(jù)庫引擎不用在處理查詢中的上鎖問題,可以提高并發(fā)性并改善數(shù)據(jù)庫性能,因為數(shù)據(jù)庫引擎不用在維護共享鎖的使用問題。存在的問題是因為該語句不能處理要讀取的數(shù)據(jù)表的所有鎖,所以一些“臟數(shù)據(jù)”或未被提交的數(shù)據(jù)潛在的可能被讀取。

如果某個事務被滾回,那么應用了NOLOCK連接的數(shù)據(jù)讀取操作將可以讀取未提交的數(shù)據(jù)。這種類型的讀取導致處理的不一致性會帶來很多問題。這是你使用NOLOCK時應該了解的技巧。

作為一個負面影響,NOLOCK查詢還可能帶來讀取“幻影”數(shù)據(jù)或讀取在一個數(shù)據(jù)庫讀取事務中可以獲得的但在另一個事務中可能被滾回的數(shù)據(jù)的風險。(我將在本系列文章的第二部分對這個負面影響進行詳細說明。)

下面的例子展示了NOLOCK如何工作以及臟數(shù)據(jù)讀取是如何產(chǎn)生的。在下面的腳本中,我用一個事務在SalesHistory數(shù)據(jù)表中插入一條記錄。

 
 
 
  1. BEGIN TRANSACTION 
  2. INSERT INTO SalesHistory 
  3. (Product, SaleDate, SalePrice) 
  4. VALUES 
  5. ('PoolTable', GETDATE(), 500) 

這個事務仍舊是開放的,這意味著仍可以對插入數(shù)據(jù)表的記錄上鎖以阻止其它操作。在一個新的查詢窗口中,運行下面的腳本,該腳本使用NOLOCK數(shù)據(jù)表提示返回SalesHistory數(shù)據(jù)表中的記錄數(shù)。

 
 
 
  1. SELECT COUNT(*) FROM SalesHistory WITH(NOLOCK) 

返回記錄數(shù)值為301。因為對SalesHistory數(shù)據(jù)表插入記錄的事務還沒有提交,所以我們可以撤銷它。我通過使用下面的語句將事務滾回:

 
 
 
  1. ROLLBACK TRANSACTION 

該語句從SalesHistory數(shù)據(jù)表中刪除前面插入的記錄?,F(xiàn)在我們運行前面運行的同樣的SELECT語句。

 
 
 
  1. SELECT COUNT(*) FROM SalesHistory WITH(NOLOCK) 

這次返回記錄數(shù)的值為300。我***次查詢讀記錄的事務還沒有提交,這就是一個臟數(shù)據(jù)讀取。

READPAST

這是一個比NOLOCK較少使用的數(shù)據(jù)表提示。這個提示指明數(shù)據(jù)庫引擎返回結(jié)果時忽略加鎖的行或數(shù)據(jù)頁。

這個數(shù)據(jù)表提示的優(yōu)點和NOLOCK一樣,在處理查詢時不會發(fā)生阻塞。此外,讀臟數(shù)據(jù)并不會出現(xiàn)在READPASTA中,因為不會返回鎖定的記錄。這個語句的缺點是,因為不返回鎖定的記錄,所以很難確定結(jié)果集或修改語句是否包含所有必須的記錄。在你的應用中可能需要添加一些邏輯來確保最終包含所有必須的記錄。

READPAST數(shù)據(jù)表提示的例子和NOLOCK的例子類似。我將使用一個事務來更新SalesHistory數(shù)據(jù)表中的一個記錄。

 
 
 
  1. BEGIN TRANSACTION 
  2. UPDATE TOP(1) SalesHistory 
  3. SET SalePrice = SalePrice + 1 

因為我沒有提交或回滾這個事務,所以添加在更新記錄上的鎖仍舊有效。在一個新的查詢編輯窗口中,運行下面的腳本,該腳本對SalesHistory數(shù)據(jù)表使用READPAST統(tǒng)計表中的記錄數(shù)。

 
 
 
  1. SELECT COUNT(*) 
  2. FROM SalesHistory WITH(READPAST) 

最初SalesHistory數(shù)據(jù)表中包含300條記錄,UPDATE語句正鎖定表中一條記錄,所以上面使用READPAST的腳本返回結(jié)果為299條記錄,這說明我要更新的記錄被鎖定,所以被REASPAST提示忽略。


本文名稱:SQLServer臟讀方式數(shù)據(jù)提取--NOLOCK和READPAST
新聞來源:http://www.dlmjj.cn/article/coeesee.html