自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server臟讀方式數(shù)據(jù)提取--NOLOCK和READPAST

數(shù)據(jù)庫(kù) SQL Server
對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行讀操作或修改時(shí),數(shù)據(jù)庫(kù)引擎使用專門的控制類型來(lái)保持?jǐn)?shù)據(jù)庫(kù)的完整性,稱為鎖機(jī)制。鎖機(jī)制通過(guò)確保包含在一個(gè)事務(wù)中的數(shù)據(jù)庫(kù)記錄在該事務(wù)提交之前不能被其它事務(wù)修改來(lái)保證數(shù)據(jù)庫(kù)的一致性。

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

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

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

NOLOCK

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

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

如果某個(gè)事務(wù)被滾回,那么應(yīng)用了NOLOCK連接的數(shù)據(jù)讀取操作將可以讀取未提交的數(shù)據(jù)。這種類型的讀取導(dǎo)致處理的不一致性會(huì)帶來(lái)很多問(wèn)題。這是你使用NOLOCK時(shí)應(yīng)該了解的技巧。

作為一個(gè)負(fù)面影響,NOLOCK查詢還可能帶來(lái)讀取“幻影”數(shù)據(jù)或讀取在一個(gè)數(shù)據(jù)庫(kù)讀取事務(wù)中可以獲得的但在另一個(gè)事務(wù)中可能被滾回的數(shù)據(jù)的風(fēng)險(xiǎn)。(我將在本系列文章的第二部分對(duì)這個(gè)負(fù)面影響進(jìn)行詳細(xì)說(shuō)明。)

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

 

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

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

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

返回記錄數(shù)值為301。因?yàn)閷?duì)SalesHistory數(shù)據(jù)表插入記錄的事務(wù)還沒(méi)有提交,所以我們可以撤銷它。我通過(guò)使用下面的語(yǔ)句將事務(wù)滾回:

  1. ROLLBACK TRANSACTION 

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

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

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

READPAST

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

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

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

 

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

因?yàn)槲覜](méi)有提交或回滾這個(gè)事務(wù),所以添加在更新記錄上的鎖仍舊有效。在一個(gè)新的查詢編輯窗口中,運(yùn)行下面的腳本,該腳本對(duì)SalesHistory數(shù)據(jù)表使用READPAST統(tǒng)計(jì)表中的記錄數(shù)。

 

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

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

原文鏈接:http://www.cnblogs.com/huanghai223/archive/2011/08/17/2143360.html

【編輯推薦】

  1. 養(yǎng)成一個(gè)SQL好習(xí)慣帶來(lái)一筆大財(cái)富
  2. 客戶的一次疏忽,DBA的一次噩夢(mèng)
  3. 數(shù)據(jù)庫(kù)的輪回
  4. 講述MySQL索引和優(yōu)化的故事
  5. 擦亮自己的眼睛去看SQL Server

 

 

責(zé)任編輯:艾婧 來(lái)源: 鉆石眼淚的博客
相關(guān)推薦

2011-08-18 10:07:53

SQL Server臟NOLOCKREADPAST

2010-07-16 09:06:51

SQL Server數(shù)

2011-08-11 09:12:31

SQL Server nolock

2021-10-13 06:49:13

SQL Server優(yōu)化

2022-04-27 07:32:02

臟讀幻讀不可重復(fù)讀

2021-04-20 19:21:50

臟讀MySQL幻讀

2019-03-21 09:06:00

數(shù)據(jù)庫(kù)復(fù)讀幻讀

2024-04-24 08:26:35

事務(wù)數(shù)據(jù)InnoDB

2023-02-02 11:53:44

nolock關(guān)鍵詞SQLserver

2022-01-03 07:18:05

臟讀幻讀 MySQL

2025-02-26 10:40:44

數(shù)據(jù)庫(kù)并發(fā)幻讀

2023-11-01 14:13:00

MySQL事務(wù)隔離級(jí)別

2015-04-09 14:26:07

2024-04-19 08:18:47

MySQLSQL隔離

2021-05-17 06:57:34

SQLServer數(shù)據(jù)庫(kù)

2011-08-15 17:55:49

提取MapInfo地圖SQL Server

2022-11-15 08:35:00

SQLNOLOCK數(shù)據(jù)

2023-04-06 08:43:29

SQLWITH(NOLOCK

2011-08-30 11:04:30

鏈接查詢內(nèi)連接外連接

2010-07-02 10:47:20

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)