日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
高效分表,提升MSSQL數(shù)據(jù)庫(kù)性能的更佳方案(mssql數(shù)據(jù)庫(kù)分表方案)

MSSQL是一種廣泛使用的數(shù)據(jù)管理系統(tǒng),主要用于管理和處理大規(guī)模的數(shù)據(jù)。然而,當(dāng)數(shù)據(jù)庫(kù)需要處理大量并發(fā)用戶或大容量數(shù)據(jù)時(shí),性能可能會(huì)出現(xiàn)問(wèn)題。為此,分區(qū)表是提高M(jìn)SSQL數(shù)據(jù)庫(kù)性能的一種更佳解決方案之一。

何謂分區(qū)表?

分區(qū)表是一種將大型表分割成較小的可管理部分的方法。每個(gè)分區(qū)都是完全獨(dú)立的表,其包含的列和數(shù)據(jù)類型與原表相同。對(duì)于MSSQL數(shù)據(jù)庫(kù),分區(qū)表能夠提供以下好處:

快速查詢

當(dāng)查詢涉及到的表非常大時(shí),查詢速度會(huì)受到影響。但是,如果將大型表分割成更小的部分,查詢速度將明顯加快。在分區(qū)表中查詢數(shù)據(jù),數(shù)據(jù)庫(kù)只需要查找與查詢條件匹配的分區(qū),而非整個(gè)表。這大大提高了查詢速度。

高效數(shù)據(jù)清理

刪除大型表的數(shù)據(jù)時(shí)涉及到的I / O操作會(huì)變得非常耗時(shí)。對(duì)于分區(qū)表,由于它已被分割成多個(gè)小模塊,所以清理一個(gè)區(qū)的數(shù)據(jù)比清理整個(gè)大型表的數(shù)據(jù)要快得多。

提高可用性

如果一張表很大,那么修復(fù)它可能需要很長(zhǎng)時(shí)間。但是,如果在分區(qū)表中只修復(fù)一個(gè)區(qū)就可以了,那么修復(fù)時(shí)間將明顯減少。這有助于提高可用性和降低數(shù)據(jù)庫(kù)風(fēng)險(xiǎn)。

提升數(shù)據(jù)質(zhì)量

可以使用分區(qū)來(lái)將不同類型的數(shù)據(jù)分開(kāi)存儲(chǔ),提高數(shù)據(jù)質(zhì)量。例如,可以根據(jù)月份將數(shù)據(jù)分區(qū)來(lái)計(jì)算每個(gè)月的平均值。這有助于避免統(tǒng)計(jì)混淆和提高數(shù)據(jù)質(zhì)量。

如何分區(qū)?

現(xiàn)在我們明白了分區(qū)表對(duì)于MSSQL數(shù)據(jù)庫(kù)性能的好處,那么如何實(shí)現(xiàn)呢?以下是分區(qū)表的三種常見(jiàn)方法:

基于范圍的分區(qū)(RANGE Partitioning)

這種方法是將表數(shù)據(jù)按指定列的范圍進(jìn)行分區(qū)。例如,一個(gè)存儲(chǔ)銷售記錄的表可以根據(jù)月份或日期進(jìn)行分區(qū)。可以使用以下示例代碼建立一個(gè)分區(qū)表:

CREATE PARTITION FUNCTION range_function(BYTE)

AS RANGE LEFT FOR VALUES(12, 24, 36, 48, 60);

CREATE PARTITION SCHEME range_scheme

AS PARTITION range_function

TO([range_1], [range_2], [range_3], [range_4], [range_5], [range_6]);

基于散列的分區(qū)(HASH Partitioning)

此方法將表數(shù)據(jù)按指定列的哈希值進(jìn)行分區(qū)。例如,可以根據(jù)員工ID將表數(shù)據(jù)分區(qū)。

CREATE PARTITION FUNCTION hash_function(INT)

AS HASH WITH (BUCKET_COUNT = 4);

CREATE PARTITION SCHEME hash_scheme

AS PARTITION hash_function

TO([hash_1], [hash_2], [hash_3], [hash_4]);

混合分區(qū)(Mixed Partitioning)

混合分區(qū)是將基于范圍和散列的分區(qū)結(jié)合使用。例如,可以先按日期將表數(shù)據(jù)分區(qū),然后在每個(gè)日期分區(qū)內(nèi)根據(jù)員工ID分區(qū)。

CREATE PARTITION FUNCTION mixed_function(DATE)

AS RANGE LEFT FOR VALUES(‘2023-02-01’, ‘2023-03-01’, ‘2023-04-01’, ‘2023-05-01’, ‘2023-06-01’);

CREATE PARTITION SCHEME mixed_scheme

AS PARTITION mixed_function

TO([range_1], [range_2], [range_3], [range_4], [range_5], [range_6]);

CREATE PARTITION FUNCTION hash_function(INT)

AS HASH WITH (BUCKET_COUNT = 8);

CREATE PARTITION SCHEME hash_scheme

AS PARTITION hash_function

TO([range_1], [range_2], [range_3], [range_4], [range_5], [range_6], [range_7], [range_8]);

實(shí)現(xiàn)分區(qū)表并不太復(fù)雜,但是在實(shí)踐中仍然需要一些額外的努力來(lái)保持整個(gè)數(shù)據(jù)庫(kù)的優(yōu)化狀態(tài)。以下是一些方法:

更新統(tǒng)計(jì)信息

當(dāng)數(shù)據(jù)分區(qū)更新后,必須更新統(tǒng)計(jì)信息以便于查詢優(yōu)化器正確計(jì)算在每個(gè)分區(qū)上執(zhí)行的操作的開(kāi)銷。

自動(dòng)化空間管理

由于分區(qū)表在大小和數(shù)量方面非常靈活,因此將手動(dòng)管理它們的繁瑣任務(wù)交給自動(dòng)管理是更為明智的選擇。

定期維護(hù)

維護(hù)一個(gè)分區(qū)表并不只是設(shè)置和忘記。它需要與整個(gè)數(shù)據(jù)庫(kù)和系統(tǒng)交互,需要跨多個(gè)級(jí)別的維護(hù)和升級(jí)。

分區(qū)表是提高M(jìn)SSQL數(shù)據(jù)庫(kù)性能的更佳解決方案之一,它能夠提高查詢速度,實(shí)現(xiàn)高效數(shù)據(jù)清理,提高可用性和數(shù)據(jù)質(zhì)量。有多種分區(qū)表的實(shí)現(xiàn)方法,包括基于范圍的分區(qū),基于散列的分區(qū)以及混合分區(qū)。然而,在實(shí)踐中實(shí)現(xiàn)分區(qū)表仍需要額外的努力,如更新統(tǒng)計(jì)信息,自動(dòng)化空間管理和定期維護(hù)。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!

如何處理大量數(shù)據(jù)并發(fā)操作

處理大量數(shù)據(jù)并發(fā)操作可以采用如下幾種方法:

1.使用緩存:使用程序直接保存到內(nèi)存中。或者使用緩存框架: 用一個(gè)特定的類型值來(lái)保存,以區(qū)別空數(shù)據(jù)和未緩存的兩種狀態(tài)。 

2.數(shù)據(jù)庫(kù)優(yōu)化:表結(jié)構(gòu)優(yōu)化;SQL語(yǔ)句優(yōu)化,語(yǔ)法優(yōu)化和處理邏輯優(yōu)化;分區(qū);分表;索引優(yōu)化;使用

存儲(chǔ)過(guò)程

代替直接操作。

3.分離活躍數(shù)據(jù):可以分為活躍用戶和不活躍用戶。

4.批量讀取和延遲修改: 高并況可以將多個(gè)查詢請(qǐng)求合并到一個(gè)。高并發(fā)且頻繁修改的可以暫存緩存中。

5.讀寫分離: 數(shù)據(jù)庫(kù)服務(wù)器配置多個(gè),配置主從數(shù)據(jù)庫(kù)。寫用主數(shù)據(jù)庫(kù),讀用從數(shù)據(jù)庫(kù)。

6.分布式數(shù)據(jù)庫(kù): 將不同的表存放到不同的數(shù)據(jù)庫(kù)中,然后再放到不同的服務(wù)器中。

7.NoSql和Hadoop: NoSql,not only SQL。沒(méi)有

關(guān)系型數(shù)據(jù)庫(kù)

那么多限制,比較靈活高效。Hadoop,將一個(gè)表中的數(shù)據(jù)分層多塊,保存到多個(gè)節(jié)點(diǎn)(分布式)。每一塊數(shù)據(jù)都有多個(gè)節(jié)點(diǎn)保存(集群)。集群可以并行處理相同的數(shù)據(jù),還可以保證數(shù)據(jù)的完整性。

拓展資料:

大數(shù)據(jù)(big data),指無(wú)法在一定時(shí)間范圍內(nèi)用常規(guī)軟件工具進(jìn)行捕捉、管理和處理的

數(shù)據(jù)

,是需要新處理模式才能具有更強(qiáng)的決策力、洞察發(fā)現(xiàn)力和流程優(yōu)化能力的海量、高

增長(zhǎng)率

和多樣化的信息資產(chǎn)。

在維克托·邁爾-舍恩伯格及肯尼斯·庫(kù)克耶編寫的

《大數(shù)據(jù)時(shí)代》

中大數(shù)據(jù)指不用隨機(jī)分析法(抽樣調(diào)查)這樣捷徑,而采用所有數(shù)據(jù)進(jìn)行分析處理。大數(shù)據(jù)的5V特點(diǎn)(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價(jià)值密度)、Veracity(真實(shí)性)。

參考資料:

網(wǎng)頁(yè)鏈接

大數(shù)據(jù)并發(fā)處理解決方案:

1、HTML靜態(tài)化

效率更高、消耗最小的就是純靜態(tài)化的html頁(yè)面,所以盡可能使網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,無(wú)法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了常見(jiàn)的信息發(fā)布系統(tǒng)CMS,像常訪問(wèn)的各個(gè)門戶站點(diǎn)的新聞?lì)l道,甚至他們的其他頻道,都是通過(guò)信息發(fā)布系統(tǒng)來(lái)管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理、權(quán)限管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效、可管理的CMS是必不可少的。

2、圖片服務(wù)器分離

對(duì)于Web服務(wù)器來(lái)說(shuō),不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是有必要將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都會(huì)采用的策略,他們都有獨(dú)立的圖片服務(wù)器,甚至很多臺(tái)圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁(yè)面訪問(wèn)請(qǐng)求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會(huì)因?yàn)閳D片問(wèn)題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如apache在配置ContentType的時(shí)候可以盡量少支持,盡可能少的LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率。 這一實(shí)現(xiàn)起來(lái)是比較容易的一現(xiàn),如果服務(wù)器集群操作起來(lái)更方便,如果是獨(dú)立的服務(wù)器,新手可能出現(xiàn)上傳圖片只能在服務(wù)器本地的情況下,可以在令一臺(tái)服務(wù)器設(shè)置的IIS采用網(wǎng)絡(luò)路徑來(lái)實(shí)現(xiàn)圖片服務(wù)器,即不用改變程序,又能提高性能,但對(duì)于服務(wù)器本身的IO處理性能是沒(méi)有任何的改變。

3、數(shù)據(jù)庫(kù)集群和庫(kù)表散列

大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫(kù),那么在面對(duì)大量訪問(wèn)的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸很快就能顯現(xiàn)出來(lái),這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無(wú)法滿足應(yīng)用,于是需要使用數(shù)據(jù)庫(kù)集群或者庫(kù)表散列。

4、緩存

緩存一詞搞技術(shù)的都接觸過(guò),很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開(kāi)發(fā)中的緩存也是非常重要。架構(gòu)方面的緩存,對(duì)Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪問(wèn)響應(yīng)能力。

網(wǎng)站程序開(kāi)發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開(kāi)發(fā)中使用,比如用Java開(kāi)發(fā)的時(shí)候就可以調(diào)用MemoryCache對(duì)一些數(shù)據(jù)進(jìn)行緩存和通訊共享,一些大型社區(qū)使用了這樣的架構(gòu)。另外,在使用web語(yǔ)言開(kāi)發(fā)的時(shí)候,各種語(yǔ)言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。

5、鏡像

鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來(lái)的用戶訪問(wèn)速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網(wǎng)站在教育網(wǎng)內(nèi)搭建鏡像站點(diǎn),數(shù)據(jù)進(jìn)行定時(shí)更新或者實(shí)時(shí)更新。在鏡像的細(xì)節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn)成的解決架構(gòu)和產(chǎn)品可選。也有廉價(jià)的通過(guò)軟件實(shí)現(xiàn)的思路,比如Linux上的rsync等工具。

6、負(fù)載均衡

負(fù)載均衡將是大型網(wǎng)站解決高負(fù)荷訪問(wèn)和大量并發(fā)請(qǐng)求采用的終極解決辦法。 負(fù)載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇。

硬件四層交換

第四層交換使用第三層和第四層信息包的報(bào)頭信息,根據(jù)應(yīng)用區(qū)間識(shí)別業(yè)務(wù)流,將整個(gè)區(qū)間段的業(yè)務(wù)流分配到合適的應(yīng)用服務(wù)器進(jìn)行處理。 第四層交換功能就象是虛IP,指向物理服務(wù)器。它傳輸?shù)臉I(yè)務(wù)服從的協(xié)議多種多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這些業(yè)務(wù)在物理服務(wù)器基礎(chǔ)上,需要復(fù)雜的載量平衡算法。在IP世界,業(yè)務(wù)類型由終端TCP或UDP端口地址來(lái)決定,在第四層交換中的應(yīng)用區(qū)間則由源端和終端IP地址、TCP和UDP端口共同決定。

在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國(guó)當(dāng)初接近2023臺(tái)服務(wù)器使用了三四臺(tái)Alteon就搞定了。

如何處理大量數(shù)據(jù)并發(fā)操作

文件緩存,數(shù)據(jù)庫(kù)緩存,優(yōu)化sql,數(shù)據(jù)分流,數(shù)據(jù)庫(kù)表的橫向和縱向劃分,優(yōu)化代碼結(jié)構(gòu)!

鎖述的概

一. 為什么要引入鎖

多個(gè)用戶同時(shí)對(duì)數(shù)據(jù)庫(kù)的并發(fā)操作時(shí)會(huì)帶來(lái)以下數(shù)據(jù)不一致的問(wèn)題:

丟失更新

A,B兩個(gè)用戶讀同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)用戶的修改結(jié)果破壞了另一個(gè)修改的結(jié)果,比如訂票系統(tǒng)

臟讀

A用戶修改了數(shù)據(jù),隨后B用戶又讀出該數(shù)據(jù),但A用戶因?yàn)槟承┰蛉∠藢?duì)數(shù)據(jù)的修改,數(shù)據(jù)恢復(fù)原值,此時(shí)B得到的數(shù)據(jù)就與數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)產(chǎn)生了不一致

不可重復(fù)讀

A用戶讀取數(shù)據(jù),隨后B用戶讀出該數(shù)據(jù)并修改,此時(shí)A用戶再讀取數(shù)據(jù)時(shí)發(fā)現(xiàn)前后兩次的值不一致

并發(fā)控制的主要方法是封鎖,鎖就是在一段時(shí)間內(nèi)禁止用戶做某些操作以避免產(chǎn)生數(shù)據(jù)不一致

二 鎖的分類

鎖的類別有兩種分法:

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

MS-SQL Server 使用以下資源鎖模式。

鎖模式 描述

共享 (S) 用于不更改或不更新數(shù)據(jù)的操作(只讀操作),如 SELECT 語(yǔ)句。

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

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

意向鎖 用于建立鎖的層次結(jié)構(gòu)。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

架構(gòu)鎖 在執(zhí)行依賴于表架構(gòu)的操作時(shí)使用。架構(gòu)鎖的類型為:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。

大容量更新 (BU) 向表中大容量復(fù)制數(shù)據(jù)并指定了 TABLOCK 提示時(shí)使用。

共享鎖

共享 (S) 鎖允許并發(fā)事務(wù)讀取 (SELECT) 一個(gè)資源。資源上存在共享 (S) 鎖時(shí),任何其它事務(wù)都不能修改數(shù)據(jù)。一旦已經(jīng)讀取數(shù)據(jù),便立即釋放資源上的共享 (S) 鎖,除非將事務(wù)隔離級(jí)別設(shè)置為可重復(fù)讀或更高級(jí)別,或者在事務(wù)生存周期內(nèi)用鎖定提示保留共享 (S) 鎖。

更新鎖

更新 (U) 鎖可以防止通常形式的死鎖。一般更新模式由一個(gè)事務(wù)組成,此事務(wù)讀取記錄,獲取資源(頁(yè)或行)的共享 (S) 鎖,然后修改行,此操作要求鎖轉(zhuǎn)換為排它 (X) 鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則一個(gè)事務(wù)嘗試將鎖轉(zhuǎn)換為排它 (X) 鎖。共享模式到排它鎖的轉(zhuǎn)換必須等待一段時(shí)間,因?yàn)橐粋€(gè)事務(wù)的排它鎖與其它事務(wù)的共享模式鎖不兼容;發(fā)生鎖等待。第二個(gè)事務(wù)試圖獲取排它 (X) 鎖以進(jìn)行更新。由于兩個(gè)事務(wù)都要轉(zhuǎn)換為排它 (X) 鎖,并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。

若要避免這種潛在的死鎖問(wèn)題,請(qǐng)使用更新 (U) 鎖。一次只有一個(gè)事務(wù)可以獲得資源的更新 (U) 鎖。如果事務(wù)修改資源,則更新 (U) 鎖轉(zhuǎn)換為排它 (X) 鎖。否則,鎖轉(zhuǎn)換為共享鎖。

排它鎖

排它 (X) 鎖可以防止并發(fā)事務(wù)對(duì)資源進(jìn)行訪問(wèn)。其它事務(wù)不能讀取或修改排它 (X) 鎖鎖定的數(shù)據(jù)。

意向鎖

意向鎖表示 SQL Server 需要在層次結(jié)構(gòu)中的某些底層資源上獲取共享 (S) 鎖或排它 (X) 鎖。例如,放置在表級(jí)的共享意向鎖表示事務(wù)打算在表中的頁(yè)或行上放置共享 (S) 鎖。在表級(jí)設(shè)置意向鎖可防止另一個(gè)事務(wù)隨后在包含那一頁(yè)的表上獲取排它 (X) 鎖。意向鎖可以提高性能,因?yàn)?SQL Server 僅在表級(jí)檢查意向鎖來(lái)確定事務(wù)是否可以安全地獲取該表上的鎖。而無(wú)須檢查表中的每行或每頁(yè)上的鎖以確定事務(wù)是否可以鎖定整個(gè)表。

意向鎖包括意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

鎖模式 描述

意向共享 (IS) 通過(guò)在各資源上放置 S 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的部分(而不是全部)底層資源。

意向排它 (IX) 通過(guò)在各資源上放置 X 鎖,表明事務(wù)的意向是修改層次結(jié)構(gòu)中的部分(而不是全部)底層資源。IX 是 IS 的超集。

與意向排它共享 (SIX) 通過(guò)在各資源上放置 IX 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的全部底層資源并修改部分(而不是全部)底層資源。允許頂層資源上的并發(fā) IS 鎖。例如,表的 SIX 鎖在表上放置一個(gè) SIX 鎖(允許并發(fā) IS 鎖),在當(dāng)前所修改頁(yè)上放置 IX 鎖(在已修改行上放置 X 鎖)。雖然每個(gè)資源在一段時(shí)間內(nèi)只能有一個(gè) SIX 鎖,以防止其它事務(wù)對(duì)資源進(jìn)行更新,但是其它事務(wù)可以通過(guò)獲取表級(jí)的 IS 鎖來(lái)讀取層次結(jié)構(gòu)中的底層資源。

獨(dú)占鎖:只允許進(jìn)行鎖定操作的程序使用,其他任何對(duì)他的操作均不會(huì)被接受。執(zhí)行數(shù)據(jù)更新命令時(shí),SQL Server會(huì)自動(dòng)使用獨(dú)占鎖。當(dāng)對(duì)象上有其他鎖存在時(shí),無(wú)法對(duì)其加獨(dú)占鎖。

共享鎖:共享鎖鎖定的資源可以被其他用戶讀取,但其他用戶無(wú)法修改它,在執(zhí)行Select時(shí),SQL Server會(huì)對(duì)對(duì)象加共享鎖。

更新鎖:當(dāng)SQL Server準(zhǔn)備更新數(shù)據(jù)時(shí),它首先對(duì)數(shù)據(jù)對(duì)象作更新鎖鎖定,這樣數(shù)據(jù)將不能被修改,但可以讀取。等到SQL Server確定要進(jìn)行更新數(shù)據(jù)操作時(shí),他會(huì)自動(dòng)將更新鎖換為獨(dú)占鎖,當(dāng)對(duì)象上有其他鎖存在時(shí),無(wú)法對(duì)其加更新鎖。

2. 從程序員的角度看:分為樂(lè)觀鎖和悲觀鎖。

樂(lè)觀鎖:完全依靠數(shù)據(jù)庫(kù)來(lái)管理鎖的工作。

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

MS-SQLSERVER 使用鎖在多個(gè)同時(shí)在數(shù)據(jù)庫(kù)內(nèi)執(zhí)行修改的用戶間實(shí)現(xiàn)悲觀并發(fā)控制

三 鎖的粒度

鎖粒度是被封鎖目標(biāo)的大小,封鎖粒度小則并發(fā)性高,但開(kāi)銷大,封鎖粒度大則并發(fā)性低但開(kāi)銷小

SQL Server支持的鎖粒度可以分為為行、頁(yè)、鍵、鍵范圍、索引、表或數(shù)據(jù)庫(kù)獲取鎖

資源 描述

RID 行標(biāo)識(shí)符。用于單獨(dú)鎖定表中的一行。

鍵 索引中的行鎖。用于保護(hù)可串行事務(wù)中的鍵范圍。

頁(yè) 8 千字節(jié) (KB) 的數(shù)據(jù)頁(yè)或索引頁(yè)。

擴(kuò)展盤區(qū) 相鄰的八個(gè)數(shù)據(jù)頁(yè)或索引頁(yè)構(gòu)成的一組。

表 包括所有數(shù)據(jù)和索引在內(nèi)的整個(gè)表。

DB 數(shù)據(jù)庫(kù)。

四 鎖定時(shí)間的長(zhǎng)短

鎖保持的時(shí)間長(zhǎng)度為保護(hù)所請(qǐng)求級(jí)別上的資源所需的時(shí)間長(zhǎng)度。

用于保護(hù)讀取操作的共享鎖的保持時(shí)間取決于事務(wù)隔離級(jí)別。采用 READ COMMITTED 的默認(rèn)事務(wù)隔離級(jí)別時(shí),只在讀取頁(yè)的期間內(nèi)控制共享鎖。在掃描中,直到在掃描內(nèi)的下一頁(yè)上獲取鎖時(shí)才釋放鎖。如果指定 HOLDLOCK 提示或者將事務(wù)隔離級(jí)別設(shè)置為 REPEATABLE READ 或 SERIALIZABLE,則直到事務(wù)結(jié)束才釋放鎖。

根據(jù)為游標(biāo)設(shè)置的并發(fā)選項(xiàng),游標(biāo)可以獲取共享模式的滾動(dòng)鎖以保護(hù)提取。當(dāng)需要滾動(dòng)鎖時(shí),直到下一次提取或關(guān)閉游標(biāo)(以先發(fā)生者為準(zhǔn))時(shí)才釋放滾動(dòng)鎖。但是,如果指定 HOLDLOCK,則直到事務(wù)結(jié)束才釋放滾動(dòng)鎖。

用于保護(hù)更新的排它鎖將直到事務(wù)結(jié)束才釋放。

如果一個(gè)連接試圖獲取一個(gè)鎖,而該鎖與另一個(gè)連接所控制的鎖沖突,則試圖獲取鎖的連接將一直阻塞到:

將沖突鎖釋放而且連接獲取了所請(qǐng)求的鎖。

連接的超時(shí)間隔已到期。默認(rèn)情況下沒(méi)有超時(shí)間隔,但是一些應(yīng)用程序設(shè)置超時(shí)間隔以防止無(wú)限期等待

五 SQL Server 中鎖的自定義

1 處理死鎖和設(shè)置死鎖優(yōu)先級(jí)

死鎖就是多個(gè)用戶申請(qǐng)不同封鎖,由于申請(qǐng)者均擁有一部分封鎖權(quán)而又等待其他用戶擁有的部分封鎖而引起的無(wú)休止的等待

可以使用SET DEADLOCK_PRIORITY控制在發(fā)生死鎖情況時(shí)會(huì)話的反應(yīng)方式。如果兩個(gè)進(jìn)程都鎖定數(shù)據(jù),并且直到其它進(jìn)程釋放自己的鎖時(shí),每個(gè)進(jìn)程才能釋放自己的鎖,即發(fā)生死鎖情況。

2 處理超時(shí)和設(shè)置鎖超時(shí)持續(xù)時(shí)間。

@@LOCK_TIMEOUT 返回當(dāng)前會(huì)話的當(dāng)前鎖超時(shí)設(shè)置,單位為毫秒

SET LOCK_TIMEOUT 設(shè)置允許應(yīng)用程序設(shè)置語(yǔ)句等待阻塞資源的最長(zhǎng)時(shí)間。當(dāng)語(yǔ)句等待的時(shí)間大于 LOCK_TIMEOUT 設(shè)置時(shí),系統(tǒng)將自動(dòng)取消阻塞的語(yǔ)句,并給應(yīng)用程序返回”已超過(guò)了鎖請(qǐng)求超時(shí)時(shí)段”的 1222 號(hào)錯(cuò)誤信息

示例

下例將鎖超時(shí)期限設(shè)置為 1,800 毫秒。

SET LOCK_TIMEOUT 1800

3) 設(shè)置事務(wù)隔離級(jí)別。

4 ) 對(duì) SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句使用表級(jí)鎖定提示。

5) 配置索引的鎖定粒度

可以使用 sp_indexoption 系統(tǒng)存儲(chǔ)過(guò)程來(lái)設(shè)置用于索引的鎖定粒度

六 查看鎖的信息

1 執(zhí)行 EXEC SP_LOCK 報(bào)告有關(guān)鎖的信息

2 查詢分析器中按Ctrl+2可以看到鎖的信息

七 使用注意事項(xiàng)

如何避免死鎖

1 使用事務(wù)時(shí),盡量縮短事務(wù)的邏輯處理過(guò)程,及早提交或回滾事務(wù);

2 設(shè)置死鎖超時(shí)參數(shù)為合理范圍,如:3分鐘-10分種;超過(guò)時(shí)間,自動(dòng)放棄本次操作,避免進(jìn)程懸掛;

3 優(yōu)化程序,檢查并避免死鎖現(xiàn)象出現(xiàn);

4 .對(duì)所有的腳本和SP都要仔細(xì)測(cè)試,在正是版本之前。

5 所有的SP都要有錯(cuò)誤處理(通過(guò)@error)

6 一般不要修改SQL SERVER事務(wù)的默認(rèn)級(jí)別。不推薦強(qiáng)行加鎖

解決問(wèn)題 如何對(duì)行 表 數(shù)據(jù)庫(kù)加鎖

八 幾個(gè)有關(guān)鎖的問(wèn)題

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解鎖

幾個(gè)例子幫助大家加深印象

設(shè)table1(A,B,C)

A B C

a1 b1 c1

a2 b2 c2

a3 b3 c3

1)排它鎖

新建兩個(gè)連接

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table1

set A=’aa’

where B=’b2′

waitfor delay ’00:00:30′ –等待30秒

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select * from table1

where B=’b2′

commit tran

若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則select查詢必須等待update執(zhí)行完畢才能執(zhí)行即要等待30秒

2)共享鎖

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select * from table1 holdlock -holdlock人為加鎖

where B=’b2′

waitfor delay ’00:00:30′ –等待30秒

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select A,C from table1

where B=’b2′

update table1

set A=’aa’

where B=’b2′

commit tran

若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則第二個(gè)連接中的select查詢可以執(zhí)行

而update必須等待之一個(gè)事務(wù)釋放共享鎖轉(zhuǎn)為排它鎖后才能執(zhí)行 即要等待30秒

3)死鎖

增設(shè)table2(D,E)

D E

d1 e1

d2 e2

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table1

set A=’aa’

where B=’b2′

waitfor delay ’00:00:30′

update table2

set D=’d5′

where E=’e1′

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table2

set D=’d5′

where E=’e1′

waitfor delay ’00:00:10′

update table1

set A=’aa’

where B=’b2′

commit tran

同時(shí)執(zhí)行,系統(tǒng)會(huì)檢測(cè)出死鎖,并中止進(jìn)程

補(bǔ)充一點(diǎn):

Sql Server2023支持的表級(jí)鎖定提示

HOLDLOCK 持有共享鎖,直到整個(gè)事務(wù)完成,應(yīng)該在被鎖對(duì)象不需要時(shí)立即釋放,等于SERIALIZABLE事務(wù)隔離級(jí)別

NOLOCK 語(yǔ)句執(zhí)行時(shí)不發(fā)出共享鎖,允許臟讀 ,等于 READ UNCOMMITTED事務(wù)隔離級(jí)別

PAGLOCK 在使用一個(gè)表鎖的地方用多個(gè)頁(yè)鎖

READPAST 讓sql server跳過(guò)任何鎖定行,執(zhí)行事務(wù),適用于READ UNCOMMITTED事務(wù)隔離級(jí)別只跳過(guò)RID鎖,不跳過(guò)頁(yè),區(qū)域和表鎖

ROWLOCK 強(qiáng)制使用行鎖

TABLOCKX 強(qiáng)制使用獨(dú)占表級(jí)鎖,這個(gè)鎖在事務(wù)期間阻止任何其他事務(wù)使用這個(gè)表

如何處理大量數(shù)據(jù)并發(fā)操作

文件緩存,數(shù)據(jù)庫(kù)緩存,優(yōu)化sql,數(shù)據(jù)分流,數(shù)據(jù)庫(kù)表的橫向和縱向劃分,優(yōu)化代碼結(jié)構(gòu)!

鎖述的概

一. 為什么要引入鎖

多個(gè)用戶同時(shí)對(duì)數(shù)據(jù)庫(kù)的并發(fā)操作時(shí)會(huì)帶來(lái)以下數(shù)據(jù)不一致的問(wèn)題:

丟失更新

A,B兩個(gè)用戶讀同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)用戶的修改結(jié)果破壞了另一個(gè)修改的結(jié)果,比如訂票系統(tǒng)

臟讀

A用戶修改了數(shù)據(jù),隨后B用戶又讀出該數(shù)據(jù),但A用戶因?yàn)槟承┰蛉∠藢?duì)數(shù)據(jù)的修改,數(shù)據(jù)恢復(fù)原值,此時(shí)B得到的數(shù)據(jù)就與數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)產(chǎn)生了不一致

不可重復(fù)讀

A用戶讀取數(shù)據(jù),隨后B用戶讀出該數(shù)據(jù)并修改,此時(shí)A用戶再讀取數(shù)據(jù)時(shí)發(fā)現(xiàn)前后兩次的值不一致

并發(fā)控制的主要方法是封鎖,鎖就是在一段時(shí)間內(nèi)禁止用戶做某些操作以避免產(chǎn)生數(shù)據(jù)不一致

二 鎖的分類

鎖的類別有兩種分法:

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

MS-SQL Server 使用以下資源鎖模式。

鎖模式 描述

共享 (S) 用于不更改或不更新數(shù)據(jù)的操作(只讀操作),如 SELECT 語(yǔ)句。

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

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

意向鎖 用于建立鎖的層次結(jié)構(gòu)。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

架構(gòu)鎖 在執(zhí)行依賴于表架構(gòu)的操作時(shí)使用。架構(gòu)鎖的類型為:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。

大容量更新 (BU) 向表中大容量復(fù)制數(shù)據(jù)并指定了 TABLOCK 提示時(shí)使用。

共享鎖

共享 (S) 鎖允許并發(fā)事務(wù)讀取 (SELECT) 一個(gè)資源。資源上存在共享 (S) 鎖時(shí),任何其它事務(wù)都不能修改數(shù)據(jù)。一旦已經(jīng)讀取數(shù)據(jù),便立即釋放資源上的共享 (S) 鎖,除非將事務(wù)隔離級(jí)別設(shè)置為可重復(fù)讀或更高級(jí)別,或者在事務(wù)生存周期內(nèi)用鎖定提示保留共享 (S) 鎖。

更新鎖

更新 (U) 鎖可以防止通常形式的死鎖。一般更新模式由一個(gè)事務(wù)組成,此事務(wù)讀取記錄,獲取資源(頁(yè)或行)的共享 (S) 鎖,然后修改行,此操作要求鎖轉(zhuǎn)換為排它 (X) 鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則一個(gè)事務(wù)嘗試將鎖轉(zhuǎn)換為排它 (X) 鎖。共享模式到排它鎖的轉(zhuǎn)換必須等待一段時(shí)間,因?yàn)橐粋€(gè)事務(wù)的排它鎖與其它事務(wù)的共享模式鎖不兼容;發(fā)生鎖等待。第二個(gè)事務(wù)試圖獲取排它 (X) 鎖以進(jìn)行更新。由于兩個(gè)事務(wù)都要轉(zhuǎn)換為排它 (X) 鎖,并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。

若要避免這種潛在的死鎖問(wèn)題,請(qǐng)使用更新 (U) 鎖。一次只有一個(gè)事務(wù)可以獲得資源的更新 (U) 鎖。如果事務(wù)修改資源,則更新 (U) 鎖轉(zhuǎn)換為排它 (X) 鎖。否則,鎖轉(zhuǎn)換為共享鎖。

排它鎖

排它 (X) 鎖可以防止并發(fā)事務(wù)對(duì)資源進(jìn)行訪問(wèn)。其它事務(wù)不能讀取或修改排它 (X) 鎖鎖定的數(shù)據(jù)。

意向鎖

意向鎖表示 SQL Server 需要在層次結(jié)構(gòu)中的某些底層資源上獲取共享 (S) 鎖或排它 (X) 鎖。例如,放置在表級(jí)的共享意向鎖表示事務(wù)打算在表中的頁(yè)或行上放置共享 (S) 鎖。在表級(jí)設(shè)置意向鎖可防止另一個(gè)事務(wù)隨后在包含那一頁(yè)的表上獲取排它 (X) 鎖。意向鎖可以提高性能,因?yàn)?SQL Server 僅在表級(jí)檢查意向鎖來(lái)確定事務(wù)是否可以安全地獲取該表上的鎖。而無(wú)須檢查表中的每行或每頁(yè)上的鎖 以確定事務(wù)是否可以鎖定整個(gè)表。

意向鎖包括意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

鎖模式 描述

意向共享 (IS) 通過(guò)在各資源上放置 S 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的部分(而不是全部)底層資源。

意向排它 (IX) 通過(guò)在各資源上放置 X 鎖,表明事務(wù)的意向是修改層次結(jié)構(gòu)中的部分(而不是全部)底層資源。IX 是 IS 的超集。

與意向排它共享 (SIX) 通過(guò)在各資源上放置 IX 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的全部底層資源并修改部分(而不是全部)底層資源。允許頂層資源上的并發(fā) IS 鎖。例如,表的 SIX 鎖在表上放置一個(gè) SIX 鎖(允許并發(fā) IS 鎖),在當(dāng)前所修改頁(yè)上放置 IX 鎖(在已修改行上放置 X 鎖)。雖然每個(gè)資源在一段時(shí)間內(nèi)只能有一個(gè) SIX 鎖,以防止其它事務(wù)對(duì)資源進(jìn)行更新,但是其它事務(wù)可以通過(guò)獲取表級(jí)的 IS 鎖來(lái)讀取層次結(jié)構(gòu)中的底層資源。

獨(dú)占鎖:只允許進(jìn)行鎖定操作的程序使用,其他任何對(duì)他的操作均不會(huì)被接受。執(zhí)行數(shù)據(jù)更新命令時(shí),SQL Server會(huì)自動(dòng)使用獨(dú)占鎖。當(dāng)對(duì)象上有其他鎖存在時(shí),無(wú)法對(duì)其加獨(dú)占鎖。

共享鎖:共享鎖鎖定的資源可以被其他用戶讀取,但其他用戶無(wú)法修改它,在執(zhí)行Select時(shí),SQL Server會(huì)對(duì)對(duì)象加共享鎖。

更新鎖:當(dāng)SQL Server準(zhǔn)備更新數(shù)據(jù)時(shí),它首先對(duì)數(shù)據(jù)對(duì)象作更新鎖鎖定,這樣數(shù)據(jù)將不能被修改,但可以讀取。等到SQL Server確定要進(jìn)行更新數(shù)據(jù)操作時(shí),他會(huì)自動(dòng)將更新鎖換為獨(dú)占鎖,當(dāng)對(duì)象上有其他鎖存在時(shí),無(wú)法對(duì)其加更新鎖。

2. 從程序員的角度看:分為樂(lè)觀鎖和悲觀鎖。

樂(lè)觀鎖:完全依靠數(shù)據(jù)庫(kù)來(lái)管理鎖的工作。

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

MS-SQLSERVER 使用鎖在多個(gè)同時(shí)在數(shù)據(jù)庫(kù)內(nèi)執(zhí)行修改的用戶間實(shí)現(xiàn)悲觀并發(fā)控制

三 鎖的粒害怠憤干蒞妨縫施俯漸度

鎖粒度是被封鎖目標(biāo)的大小,封鎖粒度小則并發(fā)性高,但開(kāi)銷大,封鎖粒度大則并發(fā)性低但開(kāi)銷小

SQL Server支持的鎖粒度可以分為為行、頁(yè)、鍵、鍵范圍、索引、表或數(shù)據(jù)庫(kù)獲取鎖

資源 描述

RID 行標(biāo)識(shí)符。用于單獨(dú)鎖定表中的一行。

鍵 索引中的行鎖。用于保護(hù)可串行事務(wù)中的鍵范圍。

頁(yè) 8 千字節(jié) (KB) 的數(shù)據(jù)頁(yè)或索引頁(yè)。

擴(kuò)展盤區(qū) 相鄰的八個(gè)數(shù)據(jù)頁(yè)或索引頁(yè)構(gòu)成的一組。

表 包括所有數(shù)據(jù)和索引在內(nèi)的整個(gè)表。

DB 數(shù)據(jù)庫(kù)。

四 鎖定時(shí)間的長(zhǎng)短

鎖保持的時(shí)間長(zhǎng)度為保護(hù)所請(qǐng)求級(jí)別上的資源所需的時(shí)間長(zhǎng)度。

用于保護(hù)讀取操作的共享鎖的保持時(shí)間取決于事務(wù)隔離級(jí)別。采用 READ COMMITTED 的默認(rèn)事務(wù)隔離級(jí)別時(shí),只在讀取頁(yè)的期間內(nèi)控制共享鎖。在掃描中,直到在掃描內(nèi)的下一頁(yè)上獲取鎖時(shí)才釋放鎖。如果指定 HOLDLOCK 提示或者將事務(wù)隔離級(jí)別設(shè)置為 REPEATABLE READ 或 SERIALIZABLE,則直到事務(wù)結(jié)束才釋放鎖。

根據(jù)為游標(biāo)設(shè)置的并發(fā)選項(xiàng),游標(biāo)可以獲取共享模式的滾動(dòng)鎖以保護(hù)提取。當(dāng)需要滾動(dòng)鎖時(shí),直到下一次提取或關(guān)閉游標(biāo)(以先發(fā)生者為準(zhǔn))時(shí)才釋放滾動(dòng)鎖。但是,如果指定 HOLDLOCK,則直到事務(wù)結(jié)束才釋放滾動(dòng)鎖。

用于保護(hù)更新的排它鎖將直到事務(wù)結(jié)束才釋放。

如果一個(gè)連接試圖獲取一個(gè)鎖,而該鎖與另一個(gè)連接所控制的鎖沖突,則試圖獲取鎖的連接將一直阻塞到:

將沖突鎖釋放而且連接獲取了所請(qǐng)求的鎖。

連接的超時(shí)間隔已到期。默認(rèn)情況下沒(méi)有超時(shí)間隔,但是一些應(yīng)用程序設(shè)置超時(shí)間隔以防止無(wú)限期等待

五 SQL Server 中鎖的自定義

1 處理死鎖和設(shè)置死鎖優(yōu)先級(jí)

死鎖就是多個(gè)用戶申請(qǐng)不同封鎖,由于申請(qǐng)者均擁有一部分封鎖權(quán)而又等待其他用戶擁有的部分封鎖而引起的無(wú)休止的等待

可以使用SET DEADLOCK_PRIORITY控制在發(fā)生死鎖情況時(shí)會(huì)話的反應(yīng)方式。如果兩個(gè)進(jìn)程都鎖定數(shù)據(jù),并且直到其它進(jìn)程釋放自己的鎖時(shí),每個(gè)進(jìn)程才能釋放自己的鎖,即發(fā)生死鎖情況。

2 處理超時(shí)和設(shè)置鎖超時(shí)持續(xù)時(shí)間。

@@LOCK_TIMEOUT 返回當(dāng)前會(huì)話的當(dāng)前鎖超時(shí)設(shè)置,單位為毫秒

SET LOCK_TIMEOUT 設(shè)置允許應(yīng)用程序設(shè)置語(yǔ)句等待阻塞資源的最長(zhǎng)時(shí)間。當(dāng)語(yǔ)句等待的時(shí)間大于 LOCK_TIMEOUT 設(shè)置時(shí),系統(tǒng)將自動(dòng)取消阻塞的語(yǔ)句,并給應(yīng)用程序返回”已超過(guò)了鎖請(qǐng)求超時(shí)時(shí)段”的 1222 號(hào)錯(cuò)誤信息

示例

下例將鎖超時(shí)期限設(shè)置為 1,800 毫秒。

SET LOCK_TIMEOUT 1800

3) 設(shè)置事務(wù)隔離級(jí)別。

4 ) 對(duì) SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句使用表級(jí)鎖定提示。

5) 配置索引的鎖定粒度

可以使用 sp_indexoption 系統(tǒng)存儲(chǔ)過(guò)程來(lái)設(shè)置用于索引的鎖定粒度

六 查看鎖的信息

1 執(zhí)行 EXEC SP_LOCK 報(bào)告有關(guān)鎖的信息

2 查詢分析器中按Ctrl+2可以看到鎖的信息

七 使用注意事項(xiàng)

如何避免死鎖

1 使用事務(wù)時(shí),盡量縮短事務(wù)的邏輯處理過(guò)程,及早提交或回滾事務(wù);

2 設(shè)置死鎖超時(shí)參數(shù)為合理范圍,如:3分鐘-10分種;超過(guò)時(shí)間,自動(dòng)放棄本次操作,避免進(jìn)程懸掛;

3 優(yōu)化程序,檢查并避免死鎖現(xiàn)象出現(xiàn);

4 .對(duì)所有的腳本和SP都要仔細(xì)測(cè)試,在正是版本之前。

5 所有的SP都要有錯(cuò)誤處理(通過(guò)@error)

6 一般不要修改SQL SERVER事務(wù)的默認(rèn)級(jí)別。不推薦強(qiáng)行加鎖

解決問(wèn)題 如何對(duì)行 表 數(shù)據(jù)庫(kù)加鎖

八 幾個(gè)有關(guān)鎖的問(wèn)題

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解鎖

幾個(gè)例子幫助大家加深印象

設(shè)table1(A,B,C)

A B C

a1 b1 c1

a2 b2 c2

a3 b3 c3

1)排它鎖

新建兩個(gè)連接

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table1

set A=’aa’

where B=’b2′

waitfor delay ’00:00:30′ –等待30秒

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select * from table1

where B=’b2′

commit tran

若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則select查詢必須等待update執(zhí)行完畢才能執(zhí)行即要等待30秒

2)共享鎖

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select * from table1 holdlock -holdlock人為加鎖

where B=’b2′

waitfor delay ’00:00:30′ –等待30秒

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

select A,C from table1

where B=’b2′

update table1

set A=’aa’

where B=’b2′

commit tran

若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則第二個(gè)連接中的select查詢可以執(zhí)行

而update必須等待之一個(gè)事務(wù)釋放共享鎖轉(zhuǎn)為排它鎖后才能執(zhí)行 即要等待30秒

3)死鎖

增設(shè)table2(D,E)

D E

d1 e1

d2 e2

在之一個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table1

set A=’aa’

where B=’b2′

waitfor delay ’00:00:30′

update table2

set D=’d5′

where E=’e1′

commit tran

在第二個(gè)連接中執(zhí)行以下語(yǔ)句

begin tran

update table2

set D=’d5′

where E=’e1′

waitfor delay ’00:00:10′

update table1

set A=’aa’

where B=’b2′

commit tran

同時(shí)執(zhí)行,系統(tǒng)會(huì)檢測(cè)出死鎖,并中止進(jìn)程

補(bǔ)充一點(diǎn):

Sql Server2023支持的表級(jí)鎖定提示

HOLDLOCK 持有共享鎖,直到整個(gè)事務(wù)完成,應(yīng)該在被鎖對(duì)象不需要時(shí)立即釋放,等于SERIALIZABLE事務(wù)隔離級(jí)別

NOLOCK 語(yǔ)句執(zhí)行時(shí)不發(fā)出共享鎖,允許臟讀 ,等于 READ UNCOMMITTED事務(wù)隔離級(jí)別

PAGLOCK 在使用一個(gè)表鎖的地方用多個(gè)頁(yè)鎖

READPAST 讓sql server跳過(guò)任何鎖定行,執(zhí)行事務(wù),適用于READ UNCOMMITTED事務(wù)隔離級(jí)別只跳過(guò)RID鎖,不跳過(guò)頁(yè),區(qū)域和表鎖

ROWLOCK 強(qiáng)制使用行鎖

TABLOCKX 強(qiáng)制使用獨(dú)占表級(jí)鎖,這個(gè)鎖在事務(wù)期間阻止任何其他事務(wù)使用這個(gè)表

mssql數(shù)據(jù)庫(kù)分表方案的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于mssql數(shù)據(jù)庫(kù)分表方案,高效分表,提升MSSQL數(shù)據(jù)庫(kù)性能的更佳方案,如何處理大量數(shù)據(jù)并發(fā)操作的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡(jiǎn)稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開(kāi)通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問(wèn)快、穩(wěn)定!


本文標(biāo)題:高效分表,提升MSSQL數(shù)據(jù)庫(kù)性能的更佳方案(mssql數(shù)據(jù)庫(kù)分表方案)
瀏覽地址:http://www.5511xx.com/article/djoecdc.html