1. 概述
SQL Server 數(shù)據(jù)庫(kù)支持多個(gè)用戶同時(shí)訪問(wèn)數(shù)據(jù)庫(kù),但當(dāng)用戶同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),就會(huì)造成并發(fā)問(wèn)題,鎖的機(jī)制能很好地解決這個(gè)問(wèn)題,保證數(shù)據(jù)的完整性和一致性;
SQL Server 自帶鎖機(jī)制,若是簡(jiǎn)單的數(shù)據(jù)庫(kù)訪問(wèn)機(jī)制,完全能滿足用戶的需求;但對(duì)于數(shù)據(jù)完全與數(shù)據(jù)完整性有特殊要求,就必須自動(dòng)控制鎖機(jī)制解決;
2. SQL Server 鎖機(jī)制
鎖是處理 SQL Server 中并發(fā)問(wèn)題的最有效手段,當(dāng)多個(gè)事務(wù)訪問(wèn)同一數(shù)據(jù)時(shí),能很好地保證數(shù)據(jù)的完整性和一致性;
在很多數(shù)據(jù)庫(kù)系統(tǒng)中(如DB2、MySQL、Oracle)都有鎖機(jī)制,其規(guī)則也大同小異;
在 SQL Server 中采用系統(tǒng)來(lái)管理鎖,SQL Server 中采用的是動(dòng)態(tài)加鎖的機(jī)制;
SQL Server 中有一套默認(rèn)的鎖機(jī)制,若用戶在使用數(shù)據(jù)庫(kù)的過(guò)程中不設(shè)置任何鎖,系統(tǒng)將自動(dòng)對(duì)鎖管理;
3. 鎖模式
在 SQL Server 中有不同的鎖,在各種鎖的類型中有些是能相互兼容的,鎖的類型決定了并發(fā)發(fā)生時(shí)數(shù)據(jù)資源的范文模式,在 SQL Server 中常用的鎖以下 5 種;
- 更新鎖:一般使用于可更新數(shù)據(jù),能防止并發(fā)訪問(wèn)中的臟讀情況以及在數(shù)據(jù)更新時(shí)可能會(huì)出現(xiàn)的死鎖情況,更新鎖一般會(huì)在對(duì)數(shù)據(jù)進(jìn)行查詢更新時(shí)使用;若事務(wù)修改資源,更新鎖會(huì)轉(zhuǎn)換為排他鎖,否則會(huì)轉(zhuǎn)換為共享鎖;在 SQL Server 中,當(dāng)一個(gè)事務(wù)訪問(wèn)資源時(shí)獲得更新鎖,其他事務(wù)能夠?qū)Y源進(jìn)行訪問(wèn),但不允許排他式訪問(wèn);
- 排他鎖:在事務(wù)對(duì)資源進(jìn)行數(shù)據(jù)更改操作(如 INSERT、UPDATE、DELETE)時(shí)使用;排他鎖能保證同一數(shù)據(jù)不會(huì)被多個(gè)事務(wù)同時(shí)進(jìn)行更改操作;
- 共享鎖:共享鎖允許多個(gè)事務(wù)同時(shí)訪問(wèn)同一資源,但不允許其他事務(wù)修改當(dāng)前事務(wù)所使用的數(shù)據(jù);
- 鍵范圍鎖:能防止幻讀,通過(guò)保護(hù)行之間鍵的范圍還能防止對(duì)事務(wù)訪問(wèn)的記錄集進(jìn)行幻讀插入或刪除;
- 架構(gòu)鎖:數(shù)據(jù)庫(kù)引擎在表數(shù)據(jù)定義語(yǔ)言(DDL)操作(如添加列或刪除表)的過(guò)程中使用架構(gòu)修改鎖;保持該鎖期間,架構(gòu)鎖將阻止對(duì)表進(jìn)行并發(fā)訪問(wèn);即架構(gòu)鎖在釋放前將阻止所有外圍操作;
4. 鎖的粒度
Microsoft SQL Server 數(shù)據(jù)庫(kù)引擎具有多粒度鎖定,允許一個(gè)事務(wù)鎖定不同類型的資源;
為了減少鎖定的開(kāi)銷,數(shù)據(jù)庫(kù)引擎自動(dòng)將資源鎖定在適合任務(wù)的級(jí)別;鎖定在較小的粒度(如行)能提高并發(fā)度,但開(kāi)銷較高,因?yàn)槿翩i定了許多行,就需要持有更多的鎖;
鎖定在加大的粒度(如表)會(huì)降低并發(fā),因?yàn)殒i定整個(gè)表限制了其他事務(wù)對(duì)表中任意部分的訪問(wèn);但其開(kāi)銷較低,因?yàn)樾枰S護(hù)的鎖較少;
數(shù)據(jù)庫(kù)引擎通常必須獲取多粒度級(jí)別上才能完整地保護(hù)資源,多粒度級(jí)別上的所稱為層次結(jié)構(gòu);
4. 查看鎖
在 SQL Server數(shù)據(jù)庫(kù)中,能通過(guò)查看 sys.dm_tran_locks 返回 SQL Server 數(shù)據(jù)庫(kù)中有關(guān)當(dāng)前活動(dòng)的鎖的管理的信息;
向鎖管理器發(fā)出的已授予鎖或正等待授予鎖的每個(gè)當(dāng)前活動(dòng)請(qǐng)求分別對(duì)應(yīng)一行;結(jié)果集中的列大體分為兩組:資源組和請(qǐng)求組;
5. 死鎖
在兩個(gè)或多個(gè)任務(wù)中,若每一個(gè)任務(wù)都鎖定了其他的資源,就會(huì)造成永久的阻塞,這種情況就是死鎖;
形成死鎖有以下 4 個(gè)必要條件:
- 互斥條件:資源不能被共享,只能被一個(gè)進(jìn)程施使用;
- 請(qǐng)求與保持條件:已獲得資源的進(jìn)程能同時(shí)申請(qǐng)其他資源;
- 非剝奪條件:已分配的資源不能從該進(jìn)程中被剝奪;
- 循環(huán)等待條件:多個(gè)進(jìn)程構(gòu)成環(huán)路,且每個(gè)進(jìn)程都在等待相鄰進(jìn)程正在使用的資源;
在一個(gè)復(fù)雜的數(shù)據(jù)庫(kù)系統(tǒng)中很難百分之百地避免死鎖,但能按照以下的訪問(wèn)策略減少死鎖的發(fā)生;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-539612.html
- 所有事務(wù)中以相同的次序使用資源;避免出現(xiàn)循環(huán);
- 減少事務(wù)持有資源的時(shí)間,避免事務(wù)中的用戶交互;
- 讓事務(wù)保持在一個(gè)批處理中;
- 由于鎖的隔離級(jí)別越高共享鎖的時(shí)間就越長(zhǎng),因此能降低隔離級(jí)別來(lái)達(dá)到減少競(jìng)爭(zhēng)的目的;
- 使用綁定連接;
注意: SQL Server 數(shù)據(jù)庫(kù)引擎自動(dòng)檢測(cè) SQL Server 中的死鎖循環(huán);數(shù)據(jù)庫(kù)引擎選擇一個(gè)會(huì)話作為死鎖的犧牲品,然后終止當(dāng)前事務(wù)(出現(xiàn)錯(cuò)誤)來(lái)打斷死鎖;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-539612.html
到了這里,關(guān)于SQLServer 數(shù)據(jù)庫(kù)之鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!