一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

.NET中鎖6大處理方法 悲觀樂(lè)觀自己掌握

  本文介紹了處理.NET中鎖的6種方法,首先我們討論一下并發(fā)性問(wèn)題,然后討論處理樂(lè)觀鎖的3種方法,樂(lè)觀鎖不能從根源上解決并發(fā)問(wèn)題,因此后面我們介紹了悲觀鎖,最后介紹隔離級(jí)別如何幫助我們實(shí)現(xiàn)悲觀鎖,每個(gè)隔離級(jí)別都列舉了示例進(jìn)行說(shuō)明,使得概念更加清晰。

  我們?yōu)槭裁葱枰i?

  在多用戶環(huán)境中,在同一時(shí)間可能會(huì)有多個(gè)用戶更新相同的記錄,這就會(huì)產(chǎn)生沖突,這個(gè)就是著名的并發(fā)性問(wèn)題。

我們?yōu)槭裁葱枰i?

  圖 1 并行性問(wèn)題漫畫(huà)

  如何解決并發(fā)性問(wèn)題?

  借助正確的鎖定策略可以解決并發(fā)性問(wèn)題,資源被鎖定后,其它進(jìn)程想要訪問(wèn)它就會(huì)被阻止。

  并發(fā)會(huì)造成什么樣的沖突?

  并發(fā)主要會(huì)導(dǎo)致四種常見(jiàn)的問(wèn)題,詳細(xì)情況請(qǐng)看下表。

問(wèn)題簡(jiǎn)要描述解釋
臟讀取當(dāng)一個(gè)事務(wù)讀取其它完成一半事務(wù)的記錄時(shí),就會(huì)發(fā)生臟讀取
  • 用戶A和用戶B看到的值都是5
  •  用戶B將值修改為2
  •  用戶A看到的值仍然是5,這時(shí)就發(fā)生了臟讀取
不可重復(fù)讀取在每次讀數(shù)據(jù)時(shí),如果你獲得的值都不一樣,那表明你遇到了不可重復(fù)讀取問(wèn)題
  • 用戶A看到的值是5
  • 用戶B將值改為2
  • 用戶A刷新后看到的值仍然是5,這時(shí)就發(fā)生了不可重復(fù)讀取
虛幻行如果update和delete SQL語(yǔ)句未對(duì)數(shù)據(jù)造成影響,很可能遇到了虛幻行問(wèn)題
  • 用戶A將所有值從5修改為2
  • 用戶B使用值2插入一個(gè)新記錄
  • 用戶A查詢所有值為2的記錄,但卻找不到,這時(shí)就發(fā)生了虛幻行
更新丟失一個(gè)事務(wù)的更新覆蓋了其它事務(wù)的更新結(jié)果,就是所謂的更新丟失
  • 用戶A將所有值從5更新為2
  • 用戶B將所有值從2更新到5
  •  用戶A丟失了他的更新

  如何解決上述沖突?

  答案是使用樂(lè)觀鎖或悲觀鎖,下面將進(jìn)一步進(jìn)行闡述。

我們?yōu)槭裁葱枰i?

  圖 2 樂(lè)觀鎖和悲觀鎖  

  什么是樂(lè)觀鎖?

  顧名思義,樂(lè)觀鎖假設(shè)多個(gè)事務(wù)相互不會(huì)影響對(duì)方,換句話說(shuō)就是,在樂(lè)觀鎖模式下,沒(méi)有鎖操作會(huì)得到執(zhí)行,事務(wù)只是驗(yàn)證是否有其它事務(wù)修改數(shù)據(jù),如果有則進(jìn)行事務(wù)回滾,否則就提交。

處理.<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>中鎖的6種方法

 圖 3 樂(lè)觀鎖

  樂(lè)觀鎖是如何工作的?

  實(shí)現(xiàn)樂(lè)觀鎖的方法有多種,但基本原則都一樣,總是少不了下面五個(gè)步驟:

  •記錄當(dāng)前的時(shí)間戳

  •開(kāi)始修改值

  •在更新前,檢查是否有其他人更新了值(通過(guò)檢查新舊時(shí)間戳實(shí)現(xiàn))

  • 如果不相等就回滾,否則就提交

處理.<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>中鎖的6種方法

  圖 4 樂(lè)觀鎖的工作原理

  實(shí)現(xiàn)樂(lè)觀鎖的解決方案

  在.NET中,實(shí)現(xiàn)樂(lè)觀鎖的方法主要有三種:

  •數(shù)據(jù)集(Dataset):數(shù)據(jù)集是實(shí)現(xiàn)樂(lè)觀鎖的默認(rèn)方法,在更新前它會(huì)檢查新舊值。

  • 時(shí)間戳數(shù)據(jù)類型(timestamp):在你的表中創(chuàng)建一個(gè)timestamp數(shù)據(jù)類型,在更新時(shí),檢查舊時(shí)間戳是否等于新時(shí)間戳。

  •直接檢查新舊值:在更新時(shí)檢查舊值和新值是否相等,如果不相等就回滾,否則就提交。

  解決方案1:數(shù)據(jù)集

  正如前面所說(shuō)的,數(shù)據(jù)集是處理樂(lè)觀鎖的默認(rèn)方法,下面是一個(gè)簡(jiǎn)單的快照,在Adapter的update函數(shù)上有一個(gè)調(diào)試點(diǎn),當(dāng)我移除斷點(diǎn)運(yùn)行update函數(shù)時(shí),它拋出如下圖所示的并行異常錯(cuò)誤。

處理.<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>中鎖的6種方法

  圖 5 Update函數(shù)執(zhí)行時(shí)拋出的異常錯(cuò)誤

  如果你運(yùn)行后端分析器,你將會(huì)看到更新語(yǔ)句檢查當(dāng)前值和舊值是否相等: 

exec sp_executesql N'UPDATE [tbl_items] SET [AuthorName] = @p1
 WHERE (([Id] = @p2) AND ((@p3 = 1 AND [ItemName] IS NULL)

OR ([ItemName] = @p4)) AND ((@p5 = 1 AND [Type] IS NULL)
OR ([Type]
= @p6)) AND ((@p7 = 1 AND [AuthorName] IS NULL)
OR ([AuthorName]
= @p8)) AND ((@p9 = 1 AND [Vendor] IS NULL)
OR ([Vendor]
= @p10)))',N'@p1 nvarchar(11),@p2 int,@p3
int,@p4 nvarchar(4),@p5 int,@p6 int,@p7
int
,@p8 nvarchar(18),@p9 int,@p10 nvarchar(2)',
@p1=N
'this is new',@p2=2,@p3=0,@p4=N'1001',@p5=0,@p6=3,@p7=0,
@p8=N
'This is Old
Author
',@p9=0,@p10=N'kk'

NET技術(shù).NET中鎖6大處理方法 悲觀樂(lè)觀自己掌握,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产永久在线观看 | 欧美精品黄页在线观看视频 | 亚洲第一二三四区 | 免费播放欧美一级特黄 | 成人欧美在线观看 | 二区在线视频 | 免费成年人在线观看视频 | 精品久久久久久国产 | 久久九九色 | 国产高清精品久久久久久久 | 国产精品福利无圣光一区二区 | 麻豆精品久久久一区二区 | 福利视频专区 | 五月伊人婷婷 | 亚洲精品国产自在久久老牛 | 婷婷成人基地 | 一区在线看 | 日韩一区二区久久久久久 | 国产成人久久精品激情 | 六月天色| 国产黄大片 | 久久国产乱子伦免费精品 | 一级亚洲 | 国内精品小视频福利网址 | 一区二区在线观看视频在线 | 在线国产一区 | 91精品国产色综合久久不卡蜜 | 免费永久在线观看污污的网站 | 亚洲香蕉久久一区二区 | 综合色吧| 欧美视频色 | 91视频看 | 久热精品6 | 91精品国产综合久久久久久 | 好吊妞视频免费观看va | 国产免费一区二区三区最新 | 成人毛片在线视频 | 色综合久久中文色婷婷 | 国产精品婷婷久青青原 | 97色精品视频在线观看免费 | 三级色网站|