色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺談管理并發數據訪問:樂觀并發控制、悲觀并發控制

西西 ? 來源:博客園 ? 作者: 深圳大漠 ? 2020-09-22 15:37 ? 次閱讀

1.并發沖突

當兩個進程試圖在同一時間修改同一數據,就會產生沖突。

2.并發控制

有兩種方式管理并發數據訪問:樂觀并發控制、悲觀并發控制。

這兩種控制模式的區別在于,是在沖突發生前進行防止,還是在發生后采用某種方法來處理沖突。

3.悲觀并發控制

悲觀并發模式假定系統中存在足夠多的數據修改操作,以致任何確定的讀操作都可能會受到由別的用戶所制造的數據修改的影響。

也就是說,悲觀并發模式假定沖突總是會發生的。

悲觀并發控制是通過獨占正在被讀取的數據來避免沖突。

但是獨占數據會導致其它進程無法修改該數據,進而產生阻塞——讀數據和寫數據會互相阻塞。

4.樂觀并發控制

樂觀并發模式假定系統的數據修改操作只會生產非常少的沖突,也就是說任何進程都不太可能修改別的進程正在訪問的數據。

樂觀并發模式下,讀數據和寫數據之間不會發生沖突,只有寫數據與寫數據之間會發生沖突。即讀數據不會產生阻塞,只有寫數據才會產生阻塞。

5.并發沖突生產的問題

5.1.丟失更新(Lost updates)

兩個進程同時讀取一筆數據,然后進行修改,那么后提交的數據會覆蓋先提交的數據。

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

5.2.臟讀(Dirty reads)

當一個進程更新了數據,但(事務)未提交,這時候另一個進程讀取同一筆數據,如果前一個進程取消了更新(事務回滾),那么后一個進程讀取的就是臟數據。

臟讀會產生嚴重的問題,在任何情況下都是不允許的。

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

當一個進程讀取了一筆數據后,另一個進程更新了同一筆數據,然后第一個進程再次讀取同一筆數據,卻得到了與第一次讀取不同的結果。

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

5.4.幻讀(Phantoms)

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

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

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

6.隔離級別

SQL Server2005支持5種隔離級別來控制沖突。其中三種只在悲觀并發模式中使用,一種只在樂觀并發模式中使用,另一個可以在兩種模式中使用。

6.1.未提交讀(Uncommitted Read)

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

未提交讀是針對阻塞太頻繁的悲觀并發控制,因為它只是忽略了鎖,而不保障事務的一致性。

6.2.已提交讀(Read Committed)

已提交讀既可以是樂觀的也可以是悲觀的,這取決于數據庫的read_committed_snapshot設置。默認情況下這個選項是關閉的,所以該隔離級別默認情況下是采用悲觀并發控制。

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

6.3.可重復讀(Repeatable Read)

可重復讀是一種悲觀的隔離級別。它在已提交讀的基礎上增加了新特性:確保當事務重新訪問數據或查詢被再一次執行時,數據將不會再發生改變。

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

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

6.4.快照(Snapshot)

快照是一種樂觀隔離級別。

Snapshot事務中任何語句所讀取的記錄,都是事務啟動時的數據。

這相當于事務啟動時,數據庫為事務生成了一份專用“快照”。

在當前事務中看到不其它事務在當前事務啟動之后所進行的數據修改。

Snapshot事務不會讀取記錄時要求鎖定,讀取記錄的Snapshot事務不會鎖住其它事務寫入記錄,寫入記錄的事務也不會鎖住Snapshot事務讀取數據。

快照隔離級別的事務不是串行執行的,兩個進程同時使用快照隔離,如果它們執行多次,可能最終產生的結果不會一致。(這段話要證實)

6.5.可串行化(Serializable)

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

可串行化是最健壯的悲觀隔離級別,因為它防止了并發沖突產生的4個問題。

可串行化也是資源開銷最大的措施。當使用可串行化隔離時,如果SQL的條件字段沒有索引,那么SQL Server會產生表級鎖。

6.6.總結

7.鎖

7.1.死鎖

當二或多個工作各自具有某個資源的鎖定,但其它工作嘗試要鎖定此資源,而造成工作永久封鎖彼此時,會發生死鎖。例如:

1.事務A取得數據列1的共享鎖定。

2.事務B取得數據列2的共享鎖定。

3.事務A現在要求數據列2的獨占鎖定,但會被封鎖直到事務B完成并釋出對數據列2的共享鎖定為止。

4.事務B現在要求數據列1的獨占鎖定,但會被封鎖直到事務A完成并釋出對數據列1的共享鎖定為止。

等到事務B完成后,事務A才能完成,但事務B被事務A封鎖了。這個狀況也稱為「循環相依性」(Cyclic Dependency)。事務A相依于事務B,并且事務B也因為相依于事務A而封閉了這個循環。

例如以下操作就會產生死鎖,兩個連接互相阻塞對方的update。

連接1:

begin tran

select * from customers

update customers set CompanyName = CompanyName

waitfor delay '00:00:05'

select * from Employees

–因為Employees被連接2鎖住了,所以這里會阻塞。

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

--因為customers被連接1鎖住了,所以這里會阻塞。

update customers set CompanyName = CompanyName

commit tran

SQL Server遇到死鎖時會自動殺死其中一個事務,而另一個事務會正常結束(提交或回滾)。

SQL Server對殺死的連接返回錯誤代碼是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,其它類型的事務都可能產生死鎖。

7.2.悲觀鎖

悲觀鎖是指假設并發更新沖突會發生,所以不管沖突是否真的發生,都會使用鎖機制。

悲觀鎖會完成以下功能:鎖住讀取的記錄,防止其它事務讀取和更新這些記錄。其它事務會一直阻塞,直到這個事務結束。

悲觀鎖是在使用了數據庫的事務隔離功能的基礎上,獨享占用的資源,以此保證讀取數據一致性,避免修改丟失。

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

7.3.樂觀鎖

樂觀鎖不會鎖住任何東西,也就是說,它不依賴數據庫的事務機制,樂觀鎖完全是應用系統層面的東西。

如果使用樂觀鎖,那么數據庫就必須加版本字段,否則就只能比較所有字段,但因為浮點類型不能比較,所以實際上沒有版本字段是不可行的。

7.4.悲觀離線鎖

悲觀離線鎖是應用程序級別的機制,它是由應用程序實現的,不是數據庫實現的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 死鎖
    +關注

    關注

    0

    文章

    25

    瀏覽量

    8081
  • 并發控制機制

    關注

    0

    文章

    2

    瀏覽量

    5641
收藏 人收藏

    評論

    相關推薦

    一文詳解CMP并發多協議

    隨著無線通信的不斷發展,對可同時支持多個協議的設備的需求顯著增加。此功能稱為并發多協議(Concurrent Multiprotocol, CMP),允許設備同時在不同無線標準下運行,從而提高設備的多功能性和適應性。
    的頭像 發表于 01-03 10:12 ?181次閱讀
    一文詳解CMP<b class='flag-5'>并發</b>多協議

    測試聊并發-入門篇

    服務端接口的性能測試中,我們面臨的挑戰不僅僅是處理單個請求的效率,更在于如何在多用戶同時訪問時保持系統的穩定性和響應速度。并發編程和測試,作為性能測試的核心,對于評估系統在高負載情況下的表現、識別潛在的性能瓶頸、
    的頭像 發表于 10-15 15:23 ?221次閱讀
    測試聊<b class='flag-5'>并發</b>-入門篇

    旋轉編碼器可以收集并發出什么信號,旋轉編碼器信號異常怎么處理

    旋轉編碼器是一種精密的測量裝置,主要用于將旋轉運動轉換為可測量的電信號。它可以收集并發出多種信號,但主要的是與旋轉運動相關的位置、速度或角度等物理量的信號。具體來說,旋轉編碼器可以收集并發出以下信號:
    的頭像 發表于 10-01 16:55 ?733次閱讀

    全雙工多路并發、低延時數傳解決行業信號擁堵問題

    SA618F30-FD全雙工透傳高允許最多8個設備同時與主控制系統進行數據交互,而不造成信道沖突和延時。這對于智能電網、智能停車場、智能交通等需要實時傳輸大量數據的場景尤為重要。例如,智能電網中的多個監測設備需要實時將采集的
    的頭像 發表于 09-19 16:34 ?564次閱讀
    全雙工多路<b class='flag-5'>并發</b>、低延時數傳解決行業信號擁堵問題

    并發物聯網云平臺是什么

    并發物聯網云平臺是一種能夠處理大量設備同時連接并進行數據交換的云計算平臺。這種平臺通常被設計用來應對來自數以萬計甚至數十億計的物聯網設備的并發請求,保證系統的穩定性和響應速度。 首先,從技術層面
    的頭像 發表于 08-13 13:50 ?289次閱讀

    并發系統的藝術:如何在流量洪峰中游刃有余

    前言 我們常說的三高,高并發、高可用、高性能,這些技術是構建現代互聯網應用程序所必需的。對于京東618備戰來說,所有的中臺系統服務,無疑都是圍繞著三高來展開的。而對于京東龐大的客戶群體,高并發的要求
    的頭像 發表于 08-05 13:43 ?315次閱讀
    高<b class='flag-5'>并發</b>系統的藝術:如何在流量洪峰中游刃有余

    3pinM8插頭的并發開關噪聲

    德索工程師說道并發開關噪聲是指在多個3pin M8插頭同時開關時產生的噪聲。由于接頭的金屬引腳氧化、變形或松動等原因,導致接觸不良,從而產生噪聲。接觸不良會導致信號傳輸不穩定,甚至中斷,進而影響設備的正常運行。
    的頭像 發表于 06-11 17:11 ?275次閱讀
    3pinM8插頭的<b class='flag-5'>并發</b>開關噪聲

    恩智浦舉辦汽車生態技術峰會,并發布全新S32 CoreRide開放平臺

    恩智浦半導體于杭州舉辦為期兩日的恩智浦汽車生態技術峰會,并發布全新S32 CoreRide開放平臺。
    的頭像 發表于 05-31 09:23 ?3459次閱讀
    恩智浦舉辦汽車生態技術峰會,<b class='flag-5'>并發</b>布全新S32 CoreRide開放平臺

    鴻蒙OS開發實例:【ArkTS類庫多線程@Concurrent裝飾器校驗并發函數】

    在使用TaskPool時,執行的并發函數需要使用該裝飾器修飾,否則無法通過相關校驗。從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
    的頭像 發表于 04-02 14:45 ?753次閱讀
    鴻蒙OS開發實例:【ArkTS類庫多線程@Concurrent裝飾器校驗<b class='flag-5'>并發</b>函數】

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    的一系列復雜偶發的問題,同時并發度也相對較高,因此得到了廣泛的支持和使用,也是當前ArkTS語言選擇的并發模型。 由于Actor模型的內存隔離特性,所以需要進行跨線程的數據序列化傳輸。 一、
    發表于 03-28 14:35

    思瑞浦受邀參加ICAC 2024并發表主題演講

    2024年3月20日-22日,華人芯片設計技術研討會(ICAC 2024)在上海中星鉑爾曼大酒店隆重舉行。思瑞浦受邀參加ICAC 2024并發表主題演講。
    的頭像 發表于 03-28 13:48 ?564次閱讀

    巨霖科技將亮相IIC Shanghai并發表主題演講

    活動預告∣巨霖科技將亮相IIC Shanghai 并發表主題演講
    的頭像 發表于 03-27 09:50 ?440次閱讀
    巨霖科技將亮相IIC Shanghai<b class='flag-5'>并發</b>表主題演講

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    的一系列復雜偶發的問題,同時并發度也相對較高,因此得到了廣泛的支持和使用,也是當前ArkTS語言選擇的并發模型。 由于Actor模型的內存隔離特性,所以需要進行跨線程的數據序列化傳輸。 一、
    發表于 03-22 15:40

    stm32wb55rg ZigBee和藍牙并發運行時,連接藍牙失敗的原因?怎么解決?

    在使用rt thread系統移植官方ZigBee_ble_dynamic的示例程序時,兩者都能并發廣播,但是一旦到藍牙連接時,系統就會停止,一直卡在ZbStartupWait info-&
    發表于 03-15 07:59

    HarmonyOS如何使用異步并發能力進行開發

    一、并發概述 并發是指在同一時間段內,能夠處理多個任務的能力。為了提升應用的響應速度與幀率,以及防止耗時任務對主線程的干擾,HarmonyOS系統提供了異步并發和多線程并發兩種處理策略
    的頭像 發表于 02-18 09:18 ?567次閱讀
    主站蜘蛛池模板: 95国产精品人妻无码久| 欧美亚洲色帝国| 九九热精品在线观看| 女bbbbxxx孕妇| 香港论理午夜电影网| 2018国产天天弄谢| 国产内射AV徐夜夜| 欧美成人无码A区在线观看免费| 亚洲国产成人久久精品影视| www.av日韩| 另类重口bdsm日本tv| 亚洲免费综合色视频| 国产成人精品免费视频下载 | 亚洲熟女片嫩草影院| 公和我做好爽添厨房中文字幕| 内射少妇36P九色| 影音先锋av男人资源| 国产手机精品一区二区| 色吧电影院| 超碰免费视频公开97| 男女床上黄色| 91国在线啪精品一区| 久久久免费观看| 一本道色播| 狠狠色综合7777久夜色撩人| 无码日本亚洲一区久久精品| 抽插H浊水H嫩B父皇| 欧美AAAAAA级午夜福利视频| 18video性欧美19sex高清| 久久久视频2019午夜福利| 亚洲一区精品伊人久久伊人| 国产专区青青在线视频| 午夜亚洲精品不卡在线| 国产毛片视频网站| 亚洲 欧美 国产 综合 在线| 国产午夜a理论毛片在线影院 | 最近的2019中文字幕HD| 久久久无码精品无码国产人妻丝瓜| 亚洲综合网国产精品一区| 交video| 一本道色播|