亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 數(shù)據(jù)庫(kù) > SQL Server > 正文

SQL Server并發(fā)處理存在就更新解決方案探討

2024-08-31 01:04:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

本節(jié)我們來(lái)講講并發(fā)中最常見的情況存在即更新,在并發(fā)中若未存在行記錄則插入,此時(shí)未處理好極容易出現(xiàn)插入重復(fù)鍵情況,本文我們來(lái)介紹對(duì)并發(fā)中存在就更新行記錄的七種方案并且我們來(lái)綜合分析最合適的解決方案。

探討存在就更新七種方案

首先我們來(lái)創(chuàng)建測(cè)試表

IF OBJECT_ID('Test') IS NOT NULL DROP TABLE TestCREATE TABLE Test( Id int, Name nchar(100), [Counter] int,primary key (Id), unique (Name));GO

解決方案一(開啟事務(wù))

我們統(tǒng)一創(chuàng)建存儲(chǔ)過(guò)程通過(guò)來(lái)SQLQueryStress來(lái)測(cè)試并發(fā)情況,我們來(lái)看第一種情況。

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  BEGIN TRANSACTION IF EXISTS ( SELECT 1    FROM Test    WHERE Id = @Id )  UPDATE Test  SET  [Counter] = [Counter] + 1  WHERE Id = @Id; ELSE  INSERT Test    ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

SQL,Server,并發(fā)處理,存在即更新

SQL,Server,并發(fā)處理,存在即更新

同時(shí)開啟100個(gè)線程和200個(gè)線程出現(xiàn)插入重復(fù)鍵的幾率比較少還是存在。

解決方案二(降低隔離級(jí)別為最低隔離級(jí)別UNCOMMITED)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION IF EXISTS ( SELECT 1    FROM Test    WHERE Id = @Id )  UPDATE Test  SET  [Counter] = [Counter] + 1  WHERE Id = @Id; ELSE  INSERT Test    ( Id, Name, [Counter] )  VALUES ( @Id, @name, 1 ); COMMITGO

此時(shí)問(wèn)題依舊和解決方案一無(wú)異(如果降低級(jí)別為最低隔離級(jí)別,如果行記錄為空,前一事務(wù)如果未進(jìn)行提交,當(dāng)前事務(wù)也能讀取到該行記錄為空,如果當(dāng)前事務(wù)插入進(jìn)去并進(jìn)行提交,此時(shí)前一事務(wù)再進(jìn)行提交此時(shí)就會(huì)出現(xiàn)插入重復(fù)鍵問(wèn)題)

SQL,Server,并發(fā)處理,存在即更新

解決方案三(提升隔離級(jí)別為最高級(jí)別SERIALIZABLE)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION IF EXISTS ( SELECT 1    FROM dbo.Test    WHERE Id = @Id )  UPDATE dbo.Test  SET  [Counter] = [Counter] + 1  WHERE Id = @Id; ELSE  INSERT dbo.Test    ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

在這種情況下更加糟糕,直接到會(huì)導(dǎo)致死鎖

SQL,Server,并發(fā)處理,存在即更新

此時(shí)將隔離級(jí)別提升為最高隔離級(jí)別會(huì)解決插入重復(fù)鍵問(wèn)題,但是對(duì)于更新來(lái)獲取排它鎖而未提交,而此時(shí)另外一個(gè)進(jìn)程進(jìn)行查詢獲取共享鎖此時(shí)將造成進(jìn)程間相互阻塞從而造成死鎖,所以從此知最高隔離級(jí)別有時(shí)候能夠解決并發(fā)問(wèn)題但是也會(huì)帶來(lái)死鎖問(wèn)題。

解決方案四(提升隔離級(jí)別+良好的鎖)

此時(shí)我們?cè)賮?lái)在添加最高隔離級(jí)別的基礎(chǔ)上增添更新鎖,如下:

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION IF EXISTS ( SELECT 1    FROM dbo.Test WITH(UPDLOCK)    WHERE Id = @Id )  UPDATE dbo.Test  SET  [Counter] = [Counter] + 1  WHERE Id = @Id; ELSE  INSERT dbo.Test    ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

SQL,Server,并發(fā)處理,存在即更新

運(yùn)行多次均未發(fā)現(xiàn)出現(xiàn)什么異常,通過(guò)查詢數(shù)據(jù)時(shí)使用更新鎖而非共享鎖,這樣的話一來(lái)可以讀取數(shù)據(jù)但不阻塞其他事務(wù),二來(lái)還確保自上次讀取數(shù)據(jù)后數(shù)據(jù)未被更改,這樣就解決了死鎖問(wèn)題。貌似這樣的方案是可行得,如果是高并發(fā)不知是否可行。

解決方案五(提升隔離級(jí)別為行版本控制SNAPSHOT)

ALTER DATABASE UpsertTestDatabaseSET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE UpsertTestDatabaseSET READ_COMMITTED_SNAPSHOT ONGO IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  BEGIN TRANSACTION IF EXISTS ( SELECT 1    FROM dbo.Test    WHERE Id = @Id )  UPDATE dbo.Test  SET  [Counter] = [Counter] + 1  WHERE Id = @Id; ELSE  INSERT dbo.Test    ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

上述解決方案也會(huì)出現(xiàn)插入重復(fù)鍵問(wèn)題不可取。

解決方案六(提升隔離級(jí)別+表變量)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100)) DECLARE @updated TABLE ( i INT );  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION UPDATE Test SET  [Counter] = [Counter] + 1 OUTPUT DELETED.Id   INTO @updated WHERE Id = @Id;  IF NOT EXISTS ( SELECT i     FROM @updated )  INSERT INTO Test    ( Id, Name, counter )  VALUES ( @Id, @Name, 1 ); COMMITGO

SQL,Server,并發(fā)處理,存在即更新

SQL,Server,并發(fā)處理,存在即更新

經(jīng)過(guò)多次認(rèn)證也是零錯(cuò)誤,貌似通過(guò)表變量形式實(shí)現(xiàn)可行。

解決方案七(提升隔離級(jí)別+Merge)

通過(guò)Merge關(guān)鍵來(lái)實(shí)現(xiàn)存在即更新否則則插入,同時(shí)我們應(yīng)該注意設(shè)置隔離級(jí)別為SERIALIZABLE否則會(huì)出現(xiàn)插入重復(fù)鍵問(wèn)題,代碼如下:

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100)) SET TRAN ISOLATION LEVEL SERIALIZABLE  BEGIN TRANSACTION MERGE Test AS [target] USING  ( SELECT @Id AS Id  ) AS source ON source.Id = [target].Id WHEN MATCHED THEN  UPDATE SET    [Counter] = [target].[Counter] + 1 WHEN NOT MATCHED THEN  INSERT ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

多次認(rèn)證無(wú)論是并發(fā)100個(gè)線程還是并發(fā)200個(gè)線程依然沒有異常信息。

總結(jié)

本節(jié)我們?cè)敿?xì)討論了在并發(fā)中如何處理存在即更新,否則即插入問(wèn)題的解決方案,目前來(lái)講以上三種方案可行。

解決方案一(最高隔離級(jí)別 + 更新鎖)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100))  BEGIN TRANSACTION;  UPDATE dbo.Test WITH ( UPDLOCK, HOLDLOCK ) SET  [Counter] = [Counter] + 1 WHERE Id = @Id;  IF ( @@ROWCOUNT = 0 )  BEGIN   INSERT dbo.Test     ( Id, Name, [Counter] )   VALUES ( @Id, @Name, 1 );  END  COMMITGO

暫時(shí)只能想到這三種解決方案,個(gè)人比較推薦方案一和方案三, 請(qǐng)問(wèn)您有何高見,請(qǐng)留下您的評(píng)論若可行,我將進(jìn)行后續(xù)補(bǔ)充。

解決方案二(最高隔離級(jí)別 + 表變量)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100)) DECLARE @updated TABLE ( i INT );  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION UPDATE Test SET  [Counter] = [Counter] + 1 OUTPUT DELETED.id   INTO @updated WHERE id = @id;  IF NOT EXISTS ( SELECT i     FROM @updated )  INSERT INTO Test    ( Id, Name, counter )  VALUES ( @Id, @Name, 1 ); COMMITGO

解決方案三(最高隔離級(jí)別 + Merge)

IF OBJECT_ID('TestPro') IS NOT NULL DROP PROCEDURE TestPro;GO CREATE PROCEDURE TestPro ( @Id INT )AS DECLARE @Name NCHAR(100) = CAST(@Id AS NCHAR(100)) SET TRAN ISOLATION LEVEL SERIALIZABLE  BEGIN TRANSACTION MERGE Test AS [target] USING  ( SELECT @Id AS Id  ) AS source ON source.Id = [target].Id WHEN MATCHED THEN  UPDATE SET    [Counter] = [target].[Counter] + 1 WHEN NOT MATCHED THEN  INSERT ( Id, Name, [Counter] )  VALUES ( @Id, @Name, 1 ); COMMITGO

暫時(shí)只能想到這三種解決方案,個(gè)人比較推薦方案一和方案三, 請(qǐng)問(wèn)您有何高見,請(qǐng)留下您的評(píng)論若可行,我將進(jìn)行后續(xù)補(bǔ)充。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到MSSQL教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产高清精品二区| 99高清视频有精品视频| 最近中文字幕在线观看视频| 红桃视频 国产| www.91在线播放| 高清一区二区中文字幕| 国产精品久久久久久亚洲影视| 无码人妻av一区二区三区波多野| 黄色片视频免费| 黄色片久久久久| 亚洲国模精品私拍| 91高清国产| 性欧美黑人xxxx| 日韩影院精彩在线| 中文字幕1区2区3区| 日韩亚洲一区在线播放| 日韩精品网站| 日韩一级高清毛片| www.日本不卡| 99视频+国产日韩欧美| 91精品福利在线一区二区三区| 色视频精品视频在线观看| 中文字幕日韩欧美精品高清在线| 午夜电影一区二区| 国产精品sm调教免费专区| 日本老太婆做爰视频| 国产一区二区精品久久99| 91丨porny丨户外露出| 1000部国产精品成人观看| 九九久久综合网站| 日韩免费在线观看av| 最新日韩在线视频| 岛国av免费观看| 欧美三级韩国三级日本一级| 免费福利视频一区| 国产精品久久久久久免费播放| 精品视频久久久| 黄色在线免费看| 成人高清视频在线| 26uuu精品一区二区三区四区在线| 另类天堂av| 开心久久婷婷综合中文字幕| 欧美精品小视频| 久久久999| 国产精品美女一区二区三区四区| 中文字幕免费在线看线人动作大片| 亚洲一区中文日韩| 日本不卡不卡| 成人自拍视频在线观看| 欧美视频在线免费| 欧美香蕉视频| 杨幂一区欧美专区| 国产精品亚洲不卡a| 国产偷人妻精品一区二区在线| 久久免费视频6| www在线免费观看视频| 成人动漫精品一区二区| 午夜亚洲一区| 欧美/亚洲一区| 亚洲人成网亚洲欧洲无码| 午夜精品中文字幕| 国产区精品视频| 国产亚洲第一的欧洲日产| 国产一区二区视频免费观看| 国产成人精品在线播放| 交视频在线观看国产| 国产一区二区三区四区五区六区| 亚洲伦片免费看| 成人涩涩小片视频日本| japanesexxxx在线播放| 亚洲人成久久| 日本一区二区三区四区五区六区| 国产999精品久久久久久绿帽| 六月丁香综合网| 精品国产青草久久久久96| 欧美日韩一区小说| 亚洲精品福利在线| 日韩精品福利一区二区三区| 一本色道久久综合狠狠躁篇的优点| 国产精品草草| 免费网站看电影大片| 欧美老女人bb| 亚洲.欧美.日本.国产综合在线| 日韩亚洲国产中文字幕欧美| 久久国产日韩| 亚洲成人aaa| 亚洲午夜视频在线| 亚洲男人天堂2019| 亚洲av无码片一区二区三区| 亚洲一区二区在线看| 国产精品亚洲激情| 中文在线不卡视频| 亚洲欧洲另类国产综合| 色天天综合狠狠色| 午夜国产视频| 免费日韩精品中文字幕视频在线| 欧美久久精品午夜青青大伊人| 欧美最顶级丰满的aⅴ艳星| 色菇凉天天综合网| 日韩精品a在线观看91| 精品国产免费人成网站| 中文字幕日韩精品一区二区| 亚洲欧美国产va在线影院| 999视频精品| 日韩片欧美片| 亚洲精品国产一区二区三区四区在线| 国产成人精品一区二三区| 最近免费中文字幕中文高清百度| 国产精品无码在线播放| 国产日韩高清一区二区三区在线| 精品人妻一区二区色欲产成人| 国产一区亚洲二区| 色噜噜成人av在线| 午夜av中文字幕| 国产伦精品一区二区三区四区视频| 国产日韩精品中文字无码| 国产香蕉一区二区三区| 欧美亚洲日本黄色| 在线这里只有精品| 做爰高潮hd色即是空| 校园春色亚洲色图| 午夜精品视频一区二区三区在线看| 噜噜噜在线视频| 成人高清免费在线| 久久成人精品视频| 国产成人av在线播放| 亚洲精品美国一| 国产一区喷水| 嫩草www视频在线观看高清| 97av视频在线观看| 在线观看日韩www视频免费| 国产综合久久久久久鬼色| 999精品色在线播放| heyzo在线| 国产精品一区二区久久| 午夜精品一区二区三区四区| 在线影院自拍| 久久久久久久久久久91| 日本欧美精品在线| 伊人网免费视频| 欧美高清影院| 天天综合网色中文字幕| 欧美系列在线观看| 欧美α欧美αv大片| 国产精品亚洲欧美| 国产一级片黄色| 日本精品人妻无码77777| 国内不卡的一区二区三区中文字幕| 天天干天天色综合| 国产在线中文字幕| 欧美少妇精品| 国产福利拍拍拍| 亚洲欧美日韩直播| 视频免费在线看| 九九九在线观看| 亚洲国内精品| 久久久久亚洲综合| av无码精品一区二区三区宅噜噜| 欧美12av| 日本中文字幕在线播放| 中文字幕一区二区三区四区久久| 日产国产欧美视频一区精品| 一区二区成人网| www.久久久精品| 中文字幕系列一区| 69久久久久久| 奇米影视第四色777| 亚洲乱码国产乱码精品精大量| 91伊人久久| 伪装者免费全集在线观看| 国产精品入口尤物| 成人网18免费网站在线| 国产精品三区在线观看| www.国产在线| 欧美激情视频免费观看| 黑人乱码一区二区三区av| 福利av痴女| 成人一区二区| 中文字幕 久热精品 视频在线| 熟女丰满老熟女熟妇| 免费成人高清在线视频| 中文字幕精品www乱入免费视频| 国产又大又粗又长| wwwww在线观看| 天堂精品一区二区三区| 日韩一二三在线视频播| 91国内精品久久久久| 在线观看xxxx| 亚洲高潮女人毛茸茸| av高清久久久| 亚洲开发第一视频在线播放| 欧美一级爱爱视频| 中文字幕av中文字幕| 曰批又黄又爽免费视频| 中文字幕在线视频精品| 久久国产欧美日韩精品| 欧美大黄免费观看| 三级在线观看视频| 香蕉视频在线免费看| 亚洲精品**中文毛片| 澳门精品久久国产| 日韩一区二区三区在线视频| 亚洲成人免费在线| 91女厕偷拍女厕偷拍高清| 羞羞答答国产精品www一本| 欧美日韩国产欧美日美国产精品| 中文字幕在线影视资源| 国产精品日韩欧美一区| 97在线视频精品| 午夜精品久久久久99热蜜桃导演| 国产一区二区三区成人欧美日韩在线观看| 欧美亚洲福利| 美女视频久久久| 男人的天堂av网| 91在线一区| 国产成人99久久亚洲综合精品| 欧美日韩在线看| 岛国精品在线播放| 亚洲国产激情| 欧美成人影院在线播放| 午夜久久久影院| 久久狠狠一本精品综合网| 成人av网在线| 欧美变态tickling挠脚心| 中文字幕色呦呦| 欧美熟妇另类久久久久久多毛| 亚洲欧美精品在线| 色资源二区在线视频| 一区二区三区国产在线观看| 91jq激情在线观看| 亚洲网站视频| 黄色综合网址| 亚洲一区二区三区久久久| 99精品人妻无码专区在线视频区| 免费看成人人体视频| 日日摸夜夜添夜夜添毛片av| 亚欧激情乱码久久久久久久久| 青青草草视频| 日本在线观看网址| 55av亚洲| 懂色av蜜臀av粉嫩av分享吧最新章节| 狠狠v欧美ⅴ日韩v亚洲v大胸| 亚洲青色在线| 国产欧美综合一区| 欧美一级黄视频| 久久久免费观看| 国产成人自拍网| 成年人午夜免费视频| 成人在线观看视频网站| 男女高潮又爽又黄又无遮挡| 992tv在线影院| 成人在线视频网址| 亚洲一区二区乱码| 成人性生交大片免费看在线播放| 国产精品一区牛牛影视| 欧美天堂亚洲电影院在线播放| 久久精品夜色噜噜亚洲aⅴ| 日本不卡二区高清三区| 午夜天堂精品久久久久| 天堂在线免费观看| 国语对白精品一区二区| 亚洲欧洲一区二区天堂久久| 亚洲福利影院| 国产精品久99| 福利在线免费视频| 日av在线播放中文不卡| 日韩欧美在线电影| 精品一区av| 好男人在线视频www| 成人豆花视频| 亚洲欧洲日韩综合一区二区| av网站免费观看| 在线播放精品视频| 日韩精品电影一区二区三区| 91激情在线观看| 欧美精品免费观看二区| 小泽玛利亚一区二区免费| 男女视频一区二区| 污污视频网站在线| 日韩在线欧美在线国产在线| 亚洲综合网中心| 精品成人免费一区二区在线播放| 亚洲女同二女同志奶水| 一区二区三区观看| 麻豆精品传媒视频| 精品亚洲免费视频| 日本又骚又刺激的视频在线观看| 在线观看视频免费| 日本熟妇毛茸茸丰满| 78国产伦精品一区二区三区| 精品在线网站观看| 亚洲精品自拍动漫在线| 女人成午夜大片7777在线| 精品国产不卡一区二区| 国产精品亚洲片在线播放| 亚洲精品免费在线看| 无码国精品一区二区免费蜜桃| 91九色在线观看视频| 午夜不卡久久精品无码免费| 色婷婷亚洲一区二区三区| 欧美扣逼视频| 欧美激情欧美| 91超碰碰碰碰久久久久久综合| 国产一区二区在线电影| 91亚洲精品一区二区乱码| 欧美a级网站| 69视频在线免费观看| 性欧美69xoxoxoxo| 91在线免费播放| 一本久道高清无码视频| 欧美国产小视频| 午夜在线观看免费一区| 国产美女特级嫩嫩嫩bbb片| 中文字幕日韩精品一区二区| 色网在线播放| 国产日韩中文字幕| 国产理论片免费观看| www免费网站在线观看| 成人黄色片在线观看| 久久视频精品在线| 国产亚洲综合色| 91麻豆精品秘密| 伊人av在线com| 青青草久久爱| 国产精品综合在线| 国产成人av免费在线观看| 正在播放国产一区| 在线观看a视频|