91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談管理并發(fā)數(shù)據(jù)訪問:樂觀并發(fā)控制、悲觀并發(fā)控制

西西 ? 來(lái)源:博客園 ? 作者: 深圳大漠 ? 2020-09-22 15:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.并發(fā)沖突

當(dāng)兩個(gè)進(jìn)程試圖在同一時(shí)間修改同一數(shù)據(jù),就會(huì)產(chǎn)生沖突。

2.并發(fā)控制

有兩種方式管理并發(fā)數(shù)據(jù)訪問:樂觀并發(fā)控制、悲觀并發(fā)控制。

這兩種控制模式的區(qū)別在于,是在沖突發(fā)生前進(jìn)行防止,還是在發(fā)生后采用某種方法來(lái)處理沖突。

3.悲觀并發(fā)控制

悲觀并發(fā)模式假定系統(tǒng)中存在足夠多的數(shù)據(jù)修改操作,以致任何確定的讀操作都可能會(huì)受到由別的用戶所制造的數(shù)據(jù)修改的影響。

也就是說,悲觀并發(fā)模式假定沖突總是會(huì)發(fā)生的。

悲觀并發(fā)控制是通過獨(dú)占正在被讀取的數(shù)據(jù)來(lái)避免沖突。

但是獨(dú)占數(shù)據(jù)會(huì)導(dǎo)致其它進(jìn)程無(wú)法修改該數(shù)據(jù),進(jìn)而產(chǎn)生阻塞——讀數(shù)據(jù)和寫數(shù)據(jù)會(huì)互相阻塞。

4.樂觀并發(fā)控制

樂觀并發(fā)模式假定系統(tǒng)的數(shù)據(jù)修改操作只會(huì)生產(chǎn)非常少的沖突,也就是說任何進(jìn)程都不太可能修改別的進(jìn)程正在訪問的數(shù)據(jù)。

樂觀并發(fā)模式下,讀數(shù)據(jù)和寫數(shù)據(jù)之間不會(huì)發(fā)生沖突,只有寫數(shù)據(jù)與寫數(shù)據(jù)之間會(huì)發(fā)生沖突。即讀數(shù)據(jù)不會(huì)產(chǎn)生阻塞,只有寫數(shù)據(jù)才會(huì)產(chǎn)生阻塞。

5.并發(fā)沖突生產(chǎn)的問題

5.1.丟失更新(Lost updates)

兩個(gè)進(jìn)程同時(shí)讀取一筆數(shù)據(jù),然后進(jìn)行修改,那么后提交的數(shù)據(jù)會(huì)覆蓋先提交的數(shù)據(jù)。

如果數(shù)據(jù)允許覆蓋式更新(比如用戶姓名),那么丟失更新并不算太大的問題,如果數(shù)據(jù)是累加式更新(比如庫(kù)存數(shù)量),那么丟失更新是非常嚴(yán)重的問題,并且在非并發(fā)模式下無(wú)法重復(fù)問題的發(fā)生。

5.2.臟讀(Dirty reads)

當(dāng)一個(gè)進(jìn)程更新了數(shù)據(jù),但(事務(wù))未提交,這時(shí)候另一個(gè)進(jìn)程讀取同一筆數(shù)據(jù),如果前一個(gè)進(jìn)程取消了更新(事務(wù)回滾),那么后一個(gè)進(jìn)程讀取的就是臟數(shù)據(jù)。

臟讀會(huì)產(chǎn)生嚴(yán)重的問題,在任何情況下都是不允許的。

5.3.不可重復(fù)讀(Non-repeatable reads)

當(dāng)一個(gè)進(jìn)程讀取了一筆數(shù)據(jù)后,另一個(gè)進(jìn)程更新了同一筆數(shù)據(jù),然后第一個(gè)進(jìn)程再次讀取同一筆數(shù)據(jù),卻得到了與第一次讀取不同的結(jié)果。

在事務(wù)A更新記錄之后(update Customers set Name = 'B' where Name = 'A'),事務(wù)B讀取相同記錄(select Name form Customers where Name = 'A'),但事務(wù)B拿到的是事務(wù)A更新之后的數(shù)據(jù)(Customers.Name的值為'B'),在事務(wù)B讀取記錄之后,事務(wù)A進(jìn)行了事務(wù)回滾(Customers.Name的值為'A'),導(dǎo)致事務(wù)B的數(shù)據(jù)是不真實(shí)的。

5.4.幻讀(Phantoms)

幻讀與臟讀的相似之處在于:兩者都是兩次讀取的結(jié)果不一致。

不同之處在于:幻讀是兩次讀取的記錄數(shù)量不一致,而臟讀是兩次讀取的記錄的數(shù)據(jù)不一致。

事務(wù)A讀取記錄之后(select * from Customers where Name like 'A%'),事務(wù)B又插入了符合事務(wù)A讀取條件的新記錄(insert into Customers(Name) values('AAA')),那么當(dāng)事務(wù)A再用相同條件讀取記錄時(shí),得到的集合卻與上一次讀取不同(多了記錄)。

6.隔離級(jí)別

SQL Server2005支持5種隔離級(jí)別來(lái)控制沖突。其中三種只在悲觀并發(fā)模式中使用,一種只在樂觀并發(fā)模式中使用,另一個(gè)可以在兩種模式中使用。

6.1.未提交讀(Uncommitted Read)

未提交讀只能防止“丟失更新”問題,其它問題不能防止。

未提交讀是針對(duì)阻塞太頻繁的悲觀并發(fā)控制,因?yàn)樗皇呛雎粤随i,而不保障事務(wù)的一致性。

6.2.已提交讀(Read Committed)

已提交讀既可以是樂觀的也可以是悲觀的,這取決于數(shù)據(jù)庫(kù)的read_committed_snapshot設(shè)置。默認(rèn)情況下這個(gè)選項(xiàng)是關(guān)閉的,所以該隔離級(jí)別默認(rèn)情況下是采用悲觀并發(fā)控制。

已提交讀可以防止臟讀問題。

6.3.可重復(fù)讀(Repeatable Read)

可重復(fù)讀是一種悲觀的隔離級(jí)別。它在已提交讀的基礎(chǔ)上增加了新特性:確保當(dāng)事務(wù)重新訪問數(shù)據(jù)或查詢被再一次執(zhí)行時(shí),數(shù)據(jù)將不會(huì)再發(fā)生改變。

可重復(fù)讀不但可以防止臟讀問題,還可以防止不可重復(fù)讀問題,但是不能防止幻讀問題。

注意,可重復(fù)讀的資源開銷是很大的,事務(wù)中所有的數(shù)據(jù)必須等待事務(wù)完成之后才能訪問。

6.4.快照(Snapshot)

快照是一種樂觀隔離級(jí)別。

Snapshot事務(wù)中任何語(yǔ)句所讀取的記錄,都是事務(wù)啟動(dòng)時(shí)的數(shù)據(jù)。

這相當(dāng)于事務(wù)啟動(dòng)時(shí),數(shù)據(jù)庫(kù)為事務(wù)生成了一份專用“快照”。

在當(dāng)前事務(wù)中看到不其它事務(wù)在當(dāng)前事務(wù)啟動(dòng)之后所進(jìn)行的數(shù)據(jù)修改。

Snapshot事務(wù)不會(huì)讀取記錄時(shí)要求鎖定,讀取記錄的Snapshot事務(wù)不會(huì)鎖住其它事務(wù)寫入記錄,寫入記錄的事務(wù)也不會(huì)鎖住Snapshot事務(wù)讀取數(shù)據(jù)。

快照隔離級(jí)別的事務(wù)不是串行執(zhí)行的,兩個(gè)進(jìn)程同時(shí)使用快照隔離,如果它們執(zhí)行多次,可能最終產(chǎn)生的結(jié)果不會(huì)一致。(這段話要證實(shí))

6.5.可串行化(Serializable)

可串行化是一種悲觀隔離級(jí)別。它在可重復(fù)讀的基礎(chǔ)上增加了新的特性:確保在兩次查詢的中間,不會(huì)增加新的行。

可串行化是最健壯的悲觀隔離級(jí)別,因?yàn)樗乐沽瞬l(fā)沖突產(chǎn)生的4個(gè)問題。

可串行化也是資源開銷最大的措施。當(dāng)使用可串行化隔離時(shí),如果SQL的條件字段沒有索引,那么SQL Server會(huì)產(chǎn)生表級(jí)鎖。

6.6.總結(jié)

7.鎖

7.1.死鎖

當(dāng)二或多個(gè)工作各自具有某個(gè)資源的鎖定,但其它工作嘗試要鎖定此資源,而造成工作永久封鎖彼此時(shí),會(huì)發(fā)生死鎖。例如:

1.事務(wù)A取得數(shù)據(jù)列1的共享鎖定。

2.事務(wù)B取得數(shù)據(jù)列2的共享鎖定。

3.事務(wù)A現(xiàn)在要求數(shù)據(jù)列2的獨(dú)占鎖定,但會(huì)被封鎖直到事務(wù)B完成并釋出對(duì)數(shù)據(jù)列2的共享鎖定為止。

4.事務(wù)B現(xiàn)在要求數(shù)據(jù)列1的獨(dú)占鎖定,但會(huì)被封鎖直到事務(wù)A完成并釋出對(duì)數(shù)據(jù)列1的共享鎖定為止。

等到事務(wù)B完成后,事務(wù)A才能完成,但事務(wù)B被事務(wù)A封鎖了。這個(gè)狀況也稱為「循環(huán)相依性」(Cyclic Dependency)。事務(wù)A相依于事務(wù)B,并且事務(wù)B也因?yàn)橄嘁烙谑聞?wù)A而封閉了這個(gè)循環(huán)。

例如以下操作就會(huì)產(chǎn)生死鎖,兩個(gè)連接互相阻塞對(duì)方的update。

連接1:

begin tran

select * from customers

update customers set CompanyName = CompanyName

waitfor delay '00:00:05'

select * from Employees

–因?yàn)镋mployees被連接2鎖住了,所以這里會(huì)阻塞。

update Employees set LastName = LastName

commit tran

連接2:

begin tran

select * from Employees

update Employees set LastName = LastName

waitfor delay '00:00:05'

select * from customers

--因?yàn)閏ustomers被連接1鎖住了,所以這里會(huì)阻塞。

update customers set CompanyName = CompanyName

commit tran

SQL Server遇到死鎖時(shí)會(huì)自動(dòng)殺死其中一個(gè)事務(wù),而另一個(gè)事務(wù)會(huì)正常結(jié)束(提交或回滾)。

SQL Server對(duì)殺死的連接返回錯(cuò)誤代碼是1205,異常提示是:

Your transaction (process ID #52) was deadlocked on {lock | communication buffer | thread} resources with another process and has been chosen as the deadlock victim. Rerun your transaction.

除了Read Uncommitted和Snapshot,其它類型的事務(wù)都可能產(chǎn)生死鎖。

7.2.悲觀鎖

悲觀鎖是指假設(shè)并發(fā)更新沖突會(huì)發(fā)生,所以不管沖突是否真的發(fā)生,都會(huì)使用鎖機(jī)制。

悲觀鎖會(huì)完成以下功能:鎖住讀取的記錄,防止其它事務(wù)讀取和更新這些記錄。其它事務(wù)會(huì)一直阻塞,直到這個(gè)事務(wù)結(jié)束。

悲觀鎖是在使用了數(shù)據(jù)庫(kù)的事務(wù)隔離功能的基礎(chǔ)上,獨(dú)享占用的資源,以此保證讀取數(shù)據(jù)一致性,避免修改丟失。

悲觀鎖可以使用Repeatable Read事務(wù),它完全滿足悲觀鎖的要求。

7.3.樂觀鎖

樂觀鎖不會(huì)鎖住任何東西,也就是說,它不依賴數(shù)據(jù)庫(kù)的事務(wù)機(jī)制,樂觀鎖完全是應(yīng)用系統(tǒng)層面的東西。

如果使用樂觀鎖,那么數(shù)據(jù)庫(kù)就必須加版本字段,否則就只能比較所有字段,但因?yàn)楦↑c(diǎn)類型不能比較,所以實(shí)際上沒有版本字段是不可行的。

7.4.悲觀離線鎖

悲觀離線鎖是應(yīng)用程序級(jí)別的機(jī)制,它是由應(yīng)用程序?qū)崿F(xiàn)的,不是數(shù)據(jù)庫(kù)實(shí)現(xiàn)的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 死鎖
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    8328
  • 并發(fā)控制機(jī)制

    關(guān)注

    0

    文章

    2

    瀏覽量

    5702
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Nginx高并發(fā)連接調(diào)優(yōu)實(shí)戰(zhàn)手冊(cè)

    Nginx 的高性能源自其事件驅(qū)動(dòng)架構(gòu)。與 Apache 的"每連接一線程"模型不同,Nginx 使用單線程事件循環(huán)處理數(shù)千個(gè)并發(fā)連接。理解這套架構(gòu)是調(diào)優(yōu)的前提。
    的頭像 發(fā)表于 03-16 15:28 ?97次閱讀

    Go 語(yǔ)言高并發(fā)服務(wù)設(shè)計(jì)與性能調(diào)優(yōu)實(shí)戰(zhàn):從萬(wàn)級(jí)到百萬(wàn)級(jí)并發(fā)的演進(jìn)之路

    在2026年的今天,Go 語(yǔ)言已成為高并發(fā)后端服務(wù)的首選語(yǔ)言。根據(jù) Stack Overflow 最新開發(fā)者調(diào)查: 指標(biāo) 數(shù)據(jù) Go 語(yǔ)言采用率 后端服務(wù)中占比 42% 平均并發(fā)能力 單節(jié)點(diǎn)
    發(fā)表于 02-18 19:19

    彈性負(fù)載均衡:現(xiàn)代 IT 架構(gòu)的高可用與高并發(fā)基石

    前言在數(shù)字化浪潮下,互聯(lián)網(wǎng)服務(wù)的訪問量呈爆炸式增長(zhǎng),單臺(tái)服務(wù)器早已難以承載海量并發(fā)請(qǐng)求。此時(shí),負(fù)載均衡(LoadBalancing)技術(shù)應(yīng)運(yùn)而生,成為優(yōu)化資源分配、提升系統(tǒng)性能的核心支撐。作為現(xiàn)代
    的頭像 發(fā)表于 01-20 09:58 ?167次閱讀
    彈性負(fù)載均衡:現(xiàn)代 IT 架構(gòu)的高可用與高<b class='flag-5'>并發(fā)</b>基石

    一文說透了如何實(shí)現(xiàn)單片機(jī)的多任務(wù)并發(fā)!

    在嵌入式系統(tǒng)開發(fā)中,多任務(wù)并發(fā)是非常常見的,對(duì)于處理復(fù)雜的應(yīng)用場(chǎng)景、提升系統(tǒng)的并發(fā)能力、提高系統(tǒng)的實(shí)時(shí)性等方面都有很大好處。在單片機(jī)中實(shí)現(xiàn)多任務(wù)并發(fā)是非常重要的,本文將為大家介紹如何在單片機(jī)中實(shí)現(xiàn)
    發(fā)表于 01-06 06:46

    華為陳實(shí)出席AfricaCom 2025并發(fā)表主題演講

    在AfricaCom 2025展會(huì)期間,華為無(wú)線網(wǎng)絡(luò)產(chǎn)品線營(yíng)銷副總裁陳實(shí)出席以“推動(dòng)智能連接,實(shí)現(xiàn)商業(yè)成功”為主題的MBB峰會(huì),并發(fā)表“創(chuàng)新開啟非洲移動(dòng)產(chǎn)業(yè)黃金十年”主題演講,以“新流量、新體驗(yàn)、新商業(yè)、新聯(lián)接、新節(jié)能”五大場(chǎng)景化創(chuàng)新,攜手產(chǎn)業(yè)解鎖增長(zhǎng)新動(dòng)能,助力非洲移動(dòng)通信產(chǎn)業(yè)實(shí)現(xiàn)高質(zhì)量發(fā)展。
    的頭像 發(fā)表于 11-12 11:26 ?937次閱讀

    Swift 的并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)

    ??前言 Swift 內(nèi)置并發(fā)系統(tǒng)的好處之一是它可以更輕松地并行執(zhí)行多個(gè)異步任務(wù),這反過來(lái)又可以使我們顯著加快可以分解為單獨(dú)部分的操作。 在本文中,讓我們看一下幾種不同的方法,以及這些技術(shù)中的每一種
    的頭像 發(fā)表于 11-11 11:33 ?462次閱讀

    工業(yè)物聯(lián)網(wǎng)數(shù)據(jù)中臺(tái)的高并發(fā)性有什么作用

    工業(yè)物聯(lián)網(wǎng)數(shù)據(jù)中臺(tái)的高并發(fā)性是保障其在復(fù)雜工業(yè)場(chǎng)景下穩(wěn)定運(yùn)行的核心能力之一。它的核心作用是確保大量設(shè)備同時(shí)接入和數(shù)據(jù)傳輸時(shí),系統(tǒng)依然能高效處理、不卡頓、不丟失數(shù)據(jù),能夠在單位時(shí)間內(nèi)高效
    的頭像 發(fā)表于 10-28 11:28 ?326次閱讀
    工業(yè)物聯(lián)網(wǎng)<b class='flag-5'>數(shù)據(jù)</b>中臺(tái)的高<b class='flag-5'>并發(fā)</b>性有什么作用

    如何理解工業(yè)數(shù)據(jù)中臺(tái)的高并發(fā)能力

    工業(yè)數(shù)據(jù)中臺(tái)的高并發(fā)能力是指其在同一時(shí)間段內(nèi)高效處理大量設(shè)備數(shù)據(jù)讀寫、分析請(qǐng)求的能力,這是保障工業(yè)數(shù)據(jù)實(shí)時(shí)采集、傳輸、處理與決策響應(yīng)穩(wěn)定性和高效性的關(guān)鍵。以下從核心價(jià)值、技術(shù)實(shí)現(xiàn)、應(yīng)用
    的頭像 發(fā)表于 10-15 11:49 ?380次閱讀

    創(chuàng)建并發(fā)布測(cè)試版本(一)

    創(chuàng)建并發(fā)布測(cè)試版本,并選擇您要分發(fā)的測(cè)試群組。邀請(qǐng)測(cè)試最多允許100個(gè)版本同時(shí)在架,邀請(qǐng)測(cè)試和公開測(cè)試的總計(jì)版本數(shù)量不超過100個(gè)。 1.在左側(cè)導(dǎo)航欄選擇“應(yīng)用測(cè)試>版本列表”,進(jìn)入
    發(fā)表于 09-16 15:21

    Nginx高并發(fā)優(yōu)化方案

    作為一名在生產(chǎn)環(huán)境中摸爬滾打多年的運(yùn)維工程師,我見過太多因?yàn)镹ginx配置不當(dāng)導(dǎo)致的性能瓶頸。今天分享一套完整的Nginx高并發(fā)優(yōu)化方案,幫助你的系統(tǒng)從10萬(wàn)QPS突破到百萬(wàn)級(jí)別。
    的頭像 發(fā)表于 08-13 15:51 ?1051次閱讀

    第三屆大會(huì)回顧第3期 | FFRT并發(fā)框架在OpenHarmony中的設(shè)計(jì)與實(shí)踐

    ,特別是在多核處理器上,可以顯著提高程序的運(yùn)行速度和整體性能,從而改善用戶體驗(yàn)。OpenHarmony的FFRT并發(fā)編程模型為開發(fā)者提供了構(gòu)建異步并發(fā)任務(wù)的能力,以更高效地開發(fā)和管理并發(fā)
    的頭像 發(fā)表于 06-21 16:53 ?1305次閱讀
    第三屆大會(huì)回顧第3期 | FFRT<b class='flag-5'>并發(fā)</b>框架在OpenHarmony中的設(shè)計(jì)與實(shí)踐

    鴻蒙5開發(fā)寶藏案例分享---應(yīng)用并發(fā)設(shè)計(jì)

    ?** 鴻蒙并發(fā)編程實(shí)戰(zhàn)指南:解鎖ArkTS多線程黑科技** 嘿,開發(fā)者朋友們! 今天給大家扒一扒鴻蒙官方文檔里藏著的并發(fā)編程寶藏—— 100+實(shí)戰(zhàn)場(chǎng)景解決方案 !從金融理財(cái)?shù)接螒蜷_發(fā),從折疊屏適配
    發(fā)表于 06-12 16:19

    Ingress網(wǎng)關(guān)高并發(fā)請(qǐng)求的解決方案

    當(dāng) Ingress 網(wǎng)關(guān)面臨高并發(fā)請(qǐng)求(如 QPS 超過 10萬(wàn)+)時(shí),可能導(dǎo)致服務(wù)崩潰、響應(yīng)延遲激增或資源耗盡。
    的頭像 發(fā)表于 05-14 11:52 ?877次閱讀

    【道生物聯(lián)TKB-620開發(fā)板試用】定期休眠并發(fā)數(shù)據(jù)

    FSM_RCVDATA時(shí),采集并發(fā)數(shù)據(jù),隨后進(jìn)入休眠: while (1) { ScreenRefresh(); KeyInfoUpdate(); FSM_Manager
    發(fā)表于 04-29 07:29

    RAKsmart服務(wù)器如何重塑AI高并發(fā)算力格局

    在AI大模型參數(shù)量突破萬(wàn)億級(jí)、實(shí)時(shí)推理需求激增的當(dāng)下,傳統(tǒng)服務(wù)器架構(gòu)的并發(fā)處理能力已逼近物理極限。RAKsmart通過“硬件重構(gòu)+軟件定義”的雙引擎創(chuàng)新,推出新一代AI服務(wù)器解決方案。下面,AI部落小編為您解析RAKsmart服務(wù)器如何重塑AI高并發(fā)算力格局。
    的頭像 發(fā)表于 04-03 10:37 ?943次閱讀