新聞中心
如何掌握SQLServer的鎖機(jī)制
SQL SERVER里的鎖機(jī)制:
目前創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、麻江網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
NOLOCK(不加鎖)
此選項(xiàng)被選中時(shí),SQL Server 在讀取或修改數(shù)據(jù)時(shí)不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(wù)(Uncommited Transaction)或回滾(Roll Back)中的數(shù)據(jù), 即所謂的“臟數(shù)據(jù)”。
HOLDLOCK(保持鎖)
此選項(xiàng)被選中時(shí),SQL Server 會(huì)將此共享鎖保持至整個(gè)事務(wù)結(jié)束,而不會(huì)在途中釋放。 例如,“ SELECT * FROM my_table HOLDLOCK”就要求在整個(gè)查詢過(guò)程中,保持對(duì)表的鎖定,直到查詢完成才釋放鎖定。
UPDLOCK(修改鎖)
此選項(xiàng)被選中時(shí),SQL Server 在讀取數(shù)據(jù)時(shí)使用修改鎖來(lái)代替共享鎖,并將此鎖保持至整個(gè)事務(wù)或命令結(jié)束。使用此選項(xiàng)能夠保證多個(gè)進(jìn)程能同時(shí)讀取數(shù)據(jù)但只有該進(jìn)程能修改數(shù)據(jù)。
TABLOCK(表鎖)
此選項(xiàng)被選中時(shí),SQL Server 將在整個(gè)表上置共享鎖直至該命令結(jié)束。 這個(gè)選項(xiàng)保證其他進(jìn)程只能讀取而不能修改數(shù)據(jù)。
PAGLOCK(頁(yè)鎖)
此選項(xiàng)為默認(rèn)選項(xiàng), 當(dāng)被選中時(shí),SQL Server 使用共享頁(yè)鎖。
TABLOCKX(排它表鎖)
此選項(xiàng)被選中時(shí),SQL Server 將在整個(gè)表上置排它鎖直至該命令或事務(wù)結(jié)束。這將防止其他進(jìn)程讀取或修改表中的數(shù)據(jù)。
sqlserver怎么實(shí)現(xiàn)一個(gè)行鎖
1?如何鎖一個(gè)表的某一行?
SET?TRANSACTION?ISOLATION?LEVEL?READ?UNCOMMITTED?
SELECT?*?FROM?table?ROWLOCK?WHERE?id?=?1?
2?鎖定數(shù)據(jù)庫(kù)的一個(gè)表?
SELECT?*?FROM?table?WITH?(HOLDLOCK)?
加鎖語(yǔ)句:
sybase:
update?表?set?col1=col1?where?1=0?;
MSSQL:
select?col1?from?表?(tablockx)?where?1=0?;
oracle:
LOCK?TABLE?表?IN?EXCLUSIVE?MODE?;
加鎖后其它人不可操作,直到加鎖用戶解鎖,用commit或rollback解鎖
sqlserver鎖表機(jī)制
這個(gè)問(wèn)題要具體分析:
第一,事務(wù)隔離級(jí)別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)
,一種是非阻塞式(read uncommitted,snapshot)。
默認(rèn)是read committed,這種情況一般在更新表的時(shí)候,如果不使用hint 提示,基本是先對(duì)表添加IX鎖,級(jí)別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務(wù)隔離級(jí)別就會(huì)先對(duì)表添加IX鎖,然后向X鎖轉(zhuǎn)化,而X鎖和大多數(shù)鎖都不兼容,容易發(fā)生表阻塞。
第二種隔離級(jí)別不會(huì)有以上問(wèn)題,但是又引入了其它的問(wèn)題。
以上是一種情況。
另外一種就是 鎖升級(jí),一個(gè)鎖是96B內(nèi)存,如果太多,sqlserver就會(huì)升級(jí)為表鎖,一般是5000以上行級(jí)鎖就升級(jí)為一個(gè)表X鎖。
所以適當(dāng)?shù)奈募纸M和表分區(qū) 是有必要的。
其次就是資源互相引用導(dǎo)致事務(wù)長(zhǎng)時(shí)間不能釋放,導(dǎo)致真正的死鎖,不過(guò)SQL2005以后,這種情況發(fā)生的概率很低。
留個(gè)問(wèn)題你自己去想。
兩個(gè)SQL,兩個(gè)連接,同時(shí)執(zhí)行。
update A set A.NAME=xxx where A.id=55
update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說(shuō)會(huì)發(fā)生什么情況呢?
解析:如何快速掌握SQLServer的鎖機(jī)制
各種大型數(shù)據(jù)庫(kù)所采用的鎖的基本理論是一致的,但在具體實(shí)現(xiàn)上各有差別。SQLServer更強(qiáng)調(diào)由系統(tǒng)來(lái)管理鎖。在用戶有SQL請(qǐng)求時(shí),系統(tǒng)分析請(qǐng)求,自動(dòng)在滿足鎖定條件和系統(tǒng)性能之間為數(shù)據(jù)庫(kù)加上適當(dāng)?shù)逆i,同時(shí)系統(tǒng)在運(yùn)行期間常常自動(dòng)進(jìn)行優(yōu)化處理,實(shí)行動(dòng)態(tài)加鎖。對(duì)于一般的用戶而言,通過(guò)系統(tǒng)的自動(dòng)鎖定管理機(jī)制基本可以滿足使用要求,但如果對(duì)數(shù)據(jù)安全、數(shù)據(jù)庫(kù)完整性和一致性有特殊要求,就需要了解SQLServer的鎖機(jī)制,掌握數(shù)據(jù)庫(kù)鎖定方法。 鎖是數(shù)據(jù)庫(kù)中的一個(gè)非常重要的概念,它主要用于多用戶環(huán)境下保證數(shù)據(jù)庫(kù)完整性和一致性。我們知道,多個(gè)用戶能夠同時(shí)操縱同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),會(huì)發(fā)生數(shù)據(jù)不一致現(xiàn)象。即如果沒(méi)有鎖定且多個(gè)用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),則當(dāng)他們的事務(wù)同時(shí)使用相同的數(shù)據(jù)時(shí)可能會(huì)發(fā)生問(wèn)題。這些問(wèn)題包括:丟失更新、臟讀、不可重復(fù)讀和幻覺(jué)讀: 1.當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行,然后基于最初選定的值更新該行時(shí),會(huì)發(fā)生丟失更新問(wèn)題。每個(gè)事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失。例如,兩個(gè)編輯人員制作了同一文檔的電子復(fù)本。每個(gè)編輯人員獨(dú)立地更改其復(fù)本,然后保存更改后的復(fù)本,這樣就覆蓋了原始文檔。最后保存其更改復(fù)本的編輯人員覆蓋了第一個(gè)編輯人員所做的更改。如果在第一個(gè)編輯人員完成之后第二個(gè)編輯人員才能進(jìn)行更改,則可以避免該問(wèn)題。 2.臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。例如,一個(gè)編輯人員正在更改電子文檔。在更改過(guò)程中,另一個(gè)編輯人員復(fù)制了該文檔(該復(fù)本包含到目前為止所做的全部更改)并將其分發(fā)給預(yù)期的用戶。此后,第一個(gè)編輯人員認(rèn)為目前所做的更改是錯(cuò)誤的,于是刪除了所做的編輯并保存了文檔。分發(fā)給用戶的文檔包含不再存在的編輯內(nèi)容,并且這些編輯內(nèi)容應(yīng)認(rèn)為從未存在過(guò)。如果在第一個(gè)編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問(wèn)題。 3.不可重復(fù)讀是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問(wèn)題。 4.幻覺(jué)讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺(jué)一樣。例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問(wèn)題。 所以,處理多用戶并發(fā)訪問(wèn)的方法是加鎖。鎖是防止其他事務(wù)訪問(wèn)指定的資源控制、實(shí)現(xiàn)并發(fā)控制的一種主要手段。當(dāng)一個(gè)用戶鎖住數(shù)據(jù)庫(kù)中的某個(gè)對(duì)象時(shí),其他用戶就不能再訪問(wèn)該對(duì)象。加鎖對(duì)并發(fā)訪問(wèn)的影響體現(xiàn)在鎖的粒度上。為了控制鎖定的資源,應(yīng)該首先了解系統(tǒng)的空間管理。在SQLServer2000系統(tǒng)中,最小的空間管理單位是頁(yè),一個(gè)頁(yè)有8K。所有的數(shù)據(jù)、日志、索引都存放在頁(yè)上。另外,使用頁(yè)有一個(gè)限制,這就是表中的一行數(shù)據(jù)必須在同一個(gè)頁(yè)上,不能跨頁(yè)。頁(yè)上面的空間管理單位是盤區(qū),一個(gè)盤區(qū)是8個(gè)連續(xù)的頁(yè)。表和索引的最小占用單位是盤區(qū)。數(shù)據(jù)庫(kù)是由一個(gè)或者多個(gè)表或者索引組成,即是由多個(gè)盤區(qū)組成。放在一個(gè)表上的鎖限制對(duì)整個(gè)表的并發(fā)訪問(wèn);放在盤區(qū)上的鎖限制了對(duì)整個(gè)盤區(qū)的訪問(wèn);放在數(shù)據(jù)頁(yè)上的鎖限制了對(duì)整個(gè)數(shù)據(jù)頁(yè)的訪問(wèn);放在行上的鎖只限制對(duì)該行的并發(fā)訪問(wèn)。 SQLServer2000具有多粒度鎖定,允許一個(gè)事務(wù)鎖定不同類型的的資源。為了使鎖定的成本減至最少,SQLServer自動(dòng)將資源鎖定在適合任務(wù)的級(jí)別。鎖定在較小的粒度(例如行)可以增加并發(fā)但需要較大的開銷,因?yàn)槿绻i定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就并發(fā)而言是相當(dāng)昂貴的,因?yàn)殒i定整個(gè)表限制了其它事務(wù)對(duì)表中任意部分進(jìn)行訪問(wèn),但要求的開銷較低,因?yàn)樾枰S護(hù)的鎖較少。SQLServer可以鎖定行、頁(yè)、擴(kuò)展盤區(qū)、表、庫(kù)等資源。 行是可以鎖定的最小空間,行級(jí)鎖占用的數(shù)據(jù)資源最少,所以在事務(wù)的處理過(guò)程中,允許其他事務(wù)繼續(xù)操縱同一個(gè)表或者同一個(gè)頁(yè)的其他數(shù)據(jù),大大降低了其他事務(wù)等待處理的時(shí)間,提高了系統(tǒng)的并發(fā)性。 頁(yè)級(jí)鎖是指在事務(wù)的操縱過(guò)程中,無(wú)論事務(wù)處理數(shù)據(jù)的多少,每一次都鎖定一頁(yè),在這個(gè)頁(yè)上的數(shù)據(jù)不能被其他事務(wù)操縱。在SQLServer7.0以前,使用的是頁(yè)級(jí)鎖。頁(yè)級(jí)鎖鎖定的資源比行級(jí)鎖鎖定的數(shù)據(jù)資源多。在頁(yè)級(jí)鎖中,即使是一個(gè)事務(wù)只操縱頁(yè)上的一行數(shù)據(jù),那么該頁(yè)上的其他數(shù)據(jù)行也不能被其他事務(wù)使用。因此,當(dāng)使用頁(yè)級(jí)鎖時(shí),會(huì)出現(xiàn)數(shù)據(jù)的浪費(fèi)現(xiàn)象,也就是說(shuō),在同一個(gè)頁(yè)上會(huì)出現(xiàn)數(shù)據(jù)被占用卻沒(méi)有使用的現(xiàn)象。在這種現(xiàn)象中,數(shù)據(jù)的浪費(fèi)最多不超過(guò)一個(gè)頁(yè)上的數(shù)據(jù)行。 表級(jí)鎖也是一個(gè)非常重要的鎖。表級(jí)鎖是指事務(wù)在操縱某一個(gè)表的數(shù)據(jù)時(shí),鎖定了這個(gè)數(shù)據(jù)所在的整個(gè)表,其他事務(wù)不能訪問(wèn)該表中的其他數(shù)據(jù)。當(dāng)事務(wù)處理的數(shù)據(jù)量比較大時(shí),一般使用表級(jí)鎖。表級(jí)鎖的特點(diǎn)是使用比較少的系統(tǒng)資源,但是卻占用比較多的數(shù)據(jù)資源。與行級(jí)鎖和頁(yè)級(jí)鎖相比,表級(jí)鎖占用的系統(tǒng)資源例如內(nèi)存比較少,但是占用的數(shù)據(jù)資源卻是最大。在表級(jí)鎖時(shí),有可能出現(xiàn)數(shù)據(jù)的大量浪費(fèi)現(xiàn)象,因?yàn)楸砑?jí)鎖鎖定整個(gè)表,那么其他的事務(wù)都不能操縱表中的其他數(shù)據(jù)。 盤區(qū)鎖是一種特殊類型的鎖,只能用在一些特殊的情況下。簇級(jí)鎖就是指事務(wù)占用一個(gè)盤區(qū),這個(gè)盤區(qū)不能同時(shí)被其他事務(wù)占用。例如在創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建表時(shí),系統(tǒng)分配物理空間時(shí)使用這種類型的鎖。系統(tǒng)是按照盤區(qū)分配空間的。當(dāng)系統(tǒng)分配空間時(shí),使用盤區(qū)鎖,防止其他事務(wù)同時(shí)使用同一個(gè)盤區(qū)。當(dāng)系統(tǒng)完成分配空間之后,就不再使用這種類型的盤區(qū)鎖。特別是,當(dāng)涉及到對(duì)數(shù)據(jù)操作的事務(wù)時(shí),不使用盤區(qū)鎖。 數(shù)據(jù)庫(kù)級(jí)鎖是指鎖定整個(gè)數(shù)據(jù)庫(kù),防止任何用戶或者事務(wù)對(duì)鎖定的數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)。數(shù)據(jù)庫(kù)級(jí)鎖是一種非常特殊的鎖,它只是用于數(shù)據(jù)庫(kù)的恢復(fù)操作過(guò)程中。這種等級(jí)的鎖是一種最高等級(jí)的鎖,因?yàn)樗刂普麄€(gè)數(shù)據(jù)庫(kù)的操作。只要對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)操作,那么就需要設(shè)置數(shù)據(jù)庫(kù)為單用戶模式,這樣系統(tǒng)就能防止其他用戶對(duì)該數(shù)據(jù)庫(kù)進(jìn)行各種操作。 行級(jí)鎖是一種最優(yōu)鎖,因?yàn)樾屑?jí)鎖不可能出現(xiàn)數(shù)據(jù)既被占用又沒(méi)有使用的浪費(fèi)現(xiàn)象。但是,如果用戶事務(wù)中頻繁對(duì)某個(gè)表中的多條記錄操作,將導(dǎo)致對(duì)該表的許多記錄行都加上了行級(jí)鎖,數(shù)據(jù)庫(kù)系統(tǒng)中鎖的數(shù)目會(huì)急劇增加,這樣就加重了系統(tǒng)負(fù)荷,影響系統(tǒng)性能。因此,在SQLServer中,還支持鎖升級(jí)(lockescalation)。所謂鎖升級(jí)是指調(diào)整鎖的粒度,將多個(gè)低粒度的鎖替換成少數(shù)的更高粒度的鎖,以此來(lái)降低系統(tǒng)負(fù)荷。在SQLServer中當(dāng)一個(gè)事務(wù)中的鎖較多,達(dá)到鎖升級(jí)門限時(shí),系統(tǒng)自動(dòng)將行級(jí)鎖和頁(yè)面鎖升級(jí)為表級(jí)鎖。
分享題目:sqlserver獲得鎖,sqlserver數(shù)據(jù)庫(kù)鎖住了
地址分享:http://www.ef60e0e.cn/article/dsdhjch.html