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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
探討:在每個表后面都加onlock是否合適

為了更好的討論是否合適,我們先解釋一些基本問題。

在廣靈等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),廣靈網(wǎng)站建設(shè)費用合理。

什么是并發(fā)訪問:同一時間有多個用戶訪問同一資源,并發(fā)用戶中如果有用戶對資源做了修改,此時就會對其它用戶產(chǎn)生某些不利的影響,例如:

1.臟讀

一個用戶對一個資源做了修改,此時另外一個用戶正好讀取了這條被修改的記錄,然后,第一個用戶放棄修改,數(shù)據(jù)回到修改之前,這兩個不同的結(jié)果就是臟讀。

2.不可重復(fù)讀

一個用戶的一個操作是一個事務(wù),這個事務(wù)分兩次讀取同一條記錄,如果第一次讀取后,有另外用戶修改了這個數(shù)據(jù),然后第二次讀取的數(shù)據(jù)正好是其它用戶修改的數(shù)據(jù),這樣造成兩次讀取的記錄不同,如果事務(wù)中鎖定這條記錄就可以避免。

3.幻讀

指用戶讀取一批記錄的情況,用戶兩次查詢同一條件的一批記錄,第一次查詢后,有其它用戶對這批數(shù)據(jù)做了修改,方法可能是修改,刪除,新增,第二次查詢時,會發(fā)現(xiàn)第一次查詢的記錄條目有的不在第二次查詢結(jié)果中,或者是第二次查詢的條目不在第一次查詢的內(nèi)容中。

為什么會在查詢的表后面加nolock標(biāo)識?為了避免并發(fā)訪問產(chǎn)生的不利影響,SQLServer有兩種并發(fā)訪問的控制機制:鎖、行版本控制,表后面加nolock是解決并發(fā)訪問的方案之一。

1>鎖,每個事務(wù)對所依賴的資源會請求不同類型的鎖,它可以阻止其他事務(wù)以某種可能會導(dǎo)致事務(wù)請求鎖出錯的方式修改資源。當(dāng)事務(wù)不再依賴鎖定的資源時,鎖將被釋放。

鎖的類型:1:表類型:鎖定整個表;2:行類型:鎖定某個行;3:文件類型:鎖定某個數(shù)據(jù)庫文件;4:數(shù)據(jù)庫類型:鎖定整個數(shù)據(jù)庫;5:頁類型:鎖定8K為單位的數(shù)據(jù)庫頁。

鎖的分類還有一種分法,就是按用戶和數(shù)據(jù)庫對象來分:

1)從數(shù)據(jù)庫系統(tǒng)的角度來看:分為獨占鎖(即排它鎖),共享鎖和更新鎖

1.共享(S):用于不更改或不更新數(shù)據(jù)的操作(只讀操作),一般常見的例如select語句。

2.更新(U):用于可更新的資源中。防止當(dāng)多個會話在讀取、鎖定以及隨后可能進(jìn)行的資源更新時發(fā)生常見形式的死鎖。

3.排它(X):用于數(shù)據(jù)修改操作,例如INSERT、UPDATE或DELETE。確保不會同時同一資源進(jìn)行多重更新。

2)從程序員的角度看:分為樂觀鎖和悲觀鎖

1.樂觀鎖:完全依靠數(shù)據(jù)庫來管理鎖的工作。

2.悲觀鎖:程序員自己管理數(shù)據(jù)或?qū)ο笊系逆i處理。

一般程序員一看到什么鎖之類,覺的特別復(fù)雜,對專業(yè)的DBA當(dāng)然是入門級知識了??上驳氖浅绦騿T不用去設(shè)置,控制這些鎖,SQLServer通過設(shè)置事務(wù)的隔離級別自動管理鎖的設(shè)置和控制。鎖管理器通過查詢分析器分析待執(zhí)行的sql語句,來判斷語句將會訪問哪些資源,進(jìn)行什么操作,然后結(jié)合設(shè)定的隔離級別自動分配管理需要用到的鎖。

2>:行版本控制:當(dāng)啟用了基于行版本控制的隔離級別時,數(shù)據(jù)庫引擎將維護修改的每一行的版本。應(yīng)用程序可以指定事務(wù)使用行版本查看事務(wù)或查詢開始時存在的數(shù)據(jù),而不是使用鎖保護所有讀取。通過使用行版本控制,讀取操作阻止其他事務(wù)的可能性將大大降低。也就是相當(dāng)于針對所有的表在查詢時都會加上nolock,同樣會產(chǎn)生臟讀的現(xiàn)象,但差別在于在一個統(tǒng)一管理的地方。說到了基于行版本控制的隔離級別,這里有必要說下隔離級別的概念。

隔離級別的用處:控制鎖的應(yīng)用,即什么場景應(yīng)用什么樣的鎖機制。

最終目的:解決并發(fā)處理帶來的種種問題。

隔離級別的分類:

1.未提交讀,隔離事務(wù)的最低級別,只能保證不讀取物理上損壞的數(shù)據(jù);

2.已提交讀,數(shù)據(jù)庫引擎的默認(rèn)級;

3.可重復(fù)讀;

4.可序列化;隔離事務(wù)的最高級別,事務(wù)之間完全隔離。

小結(jié)

NOLOCK語句執(zhí)行時不發(fā)出共享鎖,允許臟讀,等于READUNCOMMITTED事務(wù)隔離級別。nolock確實在查詢時能提高速度,但它并不是沒有缺點的,起碼它會引起臟讀。

nolock的使用場景(個人觀點):

1.數(shù)據(jù)量特別大的表,犧牲數(shù)據(jù)安全性來提升性能是可以考慮的;

2.允許出現(xiàn)臟讀現(xiàn)象的業(yè)務(wù)邏輯,反之一些數(shù)據(jù)完整性要求比較嚴(yán)格的場景就不合適了,像金融方面等。

3.數(shù)據(jù)不經(jīng)常修改的表,這樣會省于鎖定表的時間來大大加快查詢速度。

綜上所述,如果在項目中的每個查詢的表后面都加nolock,這種做法并不科學(xué),起碼特別費時間,不如行版本控制來的直接有效。而且會存在不可預(yù)期的技術(shù)問題。應(yīng)該有選擇性的挑選最適合的表來放棄共享鎖的使用。

最后說下nolock和with(nolock)的幾個小區(qū)別:

1.SQL05中的同義詞,只支持with(nolock);

2.with(nolock)的寫法非常容易再指定索引。

【編輯推薦】

  1. 詳解MySQL分組查詢Group By實現(xiàn)原理
  2. 用并行查詢讓SQL Server加速運行
  3. 解決Oracle分頁查詢中排序與效率問題

當(dāng)前標(biāo)題:探討:在每個表后面都加onlock是否合適
URL地址:http://www.dlmjj.cn/article/cdseeed.html