【MySQL】——并發控制

💻博主現有專欄:

????????????????C51單片機(STC89C516),c語言,c++,離散數學,算法設計與分析,數據結構,Python,Java基礎,MySQL,linux,基于HTML5的網頁設計及應用,Rust(官方文檔重點總結),jQuery,前端vue.js,Javaweb開發,Python機器學習等
🥏主頁鏈接:

????????????????Y小夜-CSDN博客

目錄

🎯并發控制概述

🎃丟失修改

🎃不可重復讀

🎃讀“臟”數據

🎯?封鎖

🎃什么是封鎖

🎃基本封鎖類型

🎃鎖的相容矩陣

🎯封鎖協議

🎃一級封鎖協議

🎃二級封鎖協議

🎃三級封鎖協議

🎯并發調度的可串行性

🎃?可串行化調度

🎃沖突可串行化調度

🎯并發控制


🎯并發控制概述

事務是并發控制的基本單位

并發控制機制的任務

  • 對并發操作進行正確調度
  • 保證事務的隔離性
  • 保證數據庫的一致性

并發操作帶來的數據不一致性

  • 1.丟失修改(Lost Update)
  • 2.不可重復讀(Non-repeatable Read)
  • 3.讀“臟”數據(Dirty Read)

記號

  • R(x):讀數據x
  • W(x):寫數據x

數據不一致性:由于并發操作破壞了事務的隔離性

????????并發控制就是要用正確的方式調度并發操作,使一個用戶事務的執行不受其他事務的干擾,從而避免造成數據的不一致性

????????對數據庫的應用有時允許某些不一致性,例如有些統計工作涉及數據量很大,讀到一些“臟”數據對統計精度沒什么影響,可以降低對一致性的要求以減少系統開銷

并發控制的主要技術

  • 封鎖(Locking)
  • 時間戳(Timestamp)
  • 樂觀控制法
  • 多版本并發控制(MVCC)

🎃丟失修改

????????兩個事務T1和T2讀入同一數據并修改,T2的提交結果破壞了T1提交的結果,導致T1的修改被丟失。

🎃不可重復讀

????????不可重復讀是指事務T1讀取數據后,事務T2 ? ? 執行更新操作,使T1無法再現前一次讀取結果。

????????不可重復讀包括三種情況:

(1)事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再次讀該數據時,得到與前一次不同的值

(2)事務T1按一定條件從數據庫中讀取了某些數據記錄后,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神秘地消失了。

(3)事務T1按一定條件從數據庫中讀取某些數據記錄后,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。 ? ? ?后兩種不可重復讀有時也稱為幻影現象(Phantom Row)

🎃讀“臟”數據

?讀“臟”數據是指:

  • 事務T1修改某一數據,并將其寫回磁盤
  • 事務T2讀取同一數據后,T1由于某種原因被撤銷
  • 這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致
  • T2讀到的數據就為“臟”數據,即不正確的數據

🎯?封鎖

🎃什么是封鎖

????????封鎖就是事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖

????????加鎖后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象。

????????封鎖是實現并發控制的一個非常重要的技術

🎃基本封鎖類型

????????一個事務對某個數據對象加鎖后究竟擁有什么樣的控制由封鎖的類型決定。

基本封鎖類型

  • 排它鎖(Exclusive Locks,簡記為X鎖)
  • 共享鎖(Share Locks,簡記為S鎖)

排它鎖又稱為寫鎖

  • 若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖
  • 保證其他事務在T釋放A上的鎖之前不能再讀取和修改A

共享鎖又稱為讀鎖

  • 若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖
  • 保證其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改

🎃鎖的相容矩陣

Y=Yes,相容的請求

N=No,不相容的請求

在鎖的相容矩陣中:

  • 最左邊一列表示事務T1已經獲得的數據對象上的鎖的類型,其中橫線表示沒有加鎖。
  • 最上面一行表示另一事務T2對同一數據對象發出的封鎖請求
  • ?T2的封鎖請求能否被滿足用矩陣中的Y和N表示
    • Y表示事務T2的封鎖要求與T1已持有的鎖相容,封鎖請求可以滿足
    • N表示T2的封鎖請求與T1已持有的鎖沖突,T2的請求被拒絕

🎯封鎖協議

什么是封鎖協議

  • 在運用X鎖和S鎖對數據對象加鎖時,需要約定一些規則,這些規則為封鎖協議(Locking Protocol)。
    • 何時申請X鎖或S鎖
    • 持鎖時間
    • 何時釋放
  • 對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議,它們分別在不同的程度上為并發操作的正確調度提供一定的保證。

🎃一級封鎖協議

  • 一級封鎖協議
    • 事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。
      • 正常結束(COMMIT)
      • 非正常結束(ROLLBACK)
  • 一級封鎖協議可防止丟失修改,并保證事務T是可恢復的。
  • 在一級封鎖協議中,如果僅僅是讀數據不對其進行修改,是不需要加鎖的,所以它不能保證可重復讀和不讀“臟”數據。

🎃二級封鎖協議

  • 二級封鎖協議
    • 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完后即可釋放S鎖。
  • 二級封鎖協議可以防止丟失修改和讀“臟”數據。
  • 在二級封鎖協議中,由于讀完數據后即可釋放S鎖,所以它不能保證可重復讀。

🎃三級封鎖協議

  • 三級封鎖協議
    • 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。
  • 三級封鎖協議可防止丟失修改、讀臟數據和不可重復讀。

🎯并發調度的可串行性

  • 數據庫管理系統對并發事務不同的調度可能會產生不同的結果
  • 串行調度是正確的
  • 執行結果等價于串行調度的調度也是正確的,稱為可串行化調度

🎃?可串行化調度

可串行化(Serializable)調度

  • 多個事務的并發執行是正確的,當且僅當其結果與按某一次序串行地執行這些事務時的結果相同

可串行性(Serializability)

  • 是并發事務正確調度的準則
  • 一個給定的并發調度,當且僅當它是可串行化的,才認為是正確調度

🎃沖突可串行化調度

沖突可串行化

一個比可串行化更嚴格的條件

商用系統中的調度器采用

沖突操作:是指不同的事務對同一數據的讀寫操作和寫寫操作:

? ?? ? ?Ri(x)與Wj(x)?? ? ? ? ? /*事務Ti讀x,Tj寫x,其中i≠j*/

? ? ? ? Wi(x)與Wj(x) ? ? ? ? /*事務Ti寫x,Tj寫x,其中i≠j*/

? ?? ? 其他操作是不沖突操作

🎯并發控制

數據庫管理系統普遍采用兩段鎖協議的方法實現并發調度的可串行性,從而保證調度的正確性

兩段鎖協議

? ? ?指所有事務必須分兩個階段對數據項加鎖和解鎖

  • 在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖
  • ?在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖

“兩段”鎖的含義

事務分為兩個階段

  • ?第一階段是獲得封鎖,也稱為擴展階段
    • 事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖
  • ?第二階段是釋放封鎖,也稱為收縮階段
    • 事務可以釋放任何數據項上的任何類型的鎖,但是不能再申請任何鎖

學習推薦:

????????在當今這個飛速發展的信息時代,人工智能(AI)已經成為了一個不可或缺的技術力量,它正在逐步改變著我們的生活、工作乃至整個社會的運作方式。從智能語音助手到自動駕駛汽車,從精準醫療到智慧城市,人工智能的應用已經滲透到了我們生活的方方面面。因此,學習和掌握人工智能相關的知識和技能,對于任何希望在這個時代保持競爭力的個人來說,都已經變得至關重要。

????????然而,人工智能是一個涉及數學、計算機科學、數據科學、機器學習、神經網絡等多個領域的交叉學科,其學習曲線相對陡峭,對初學者來說可能會有一定的挑戰性。幸運的是,隨著互聯網教育資源的豐富,現在有大量優秀的在線平臺和網站提供了豐富的人工智能學習材料,包括視頻教程、互動課程、實戰項目等,這些資源無疑為學習者打開了一扇通往人工智能世界的大門。

????????前些天發現了一個巨牛的人工智能學習網站:前言 – 人工智能教程通俗易懂,風趣幽默,忍不住分享一下給大家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16045.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機畢業設計 | springboot+vue房屋租賃管理系統(附源碼)

1,緒論 1.1 課題來源 隨著社會的不斷發展以及大家生活水平的提高,越來越多的年輕人選擇在大城市發展。在大城市發展就意味著要在外面有一處安身的地方。在租房的過程中,大家也面臨著各種各樣的問題,比如需要費時費力去現場看房&…

oj項目后端分析

1.菜單管理 我們菜單管理有菜單表(sys_menu),還有用戶角色表(sys_role),菜單表是用于管理我們用戶所擁有的權限,不同的用戶所看到的頁面是不一樣的,由于一些用戶他能夠看到題庫管理和考題管理,還…

Anaconda Anaconda支持什么編程語言的環境配置

Anaconda是一個數據科學和機器學習的開發環境,它支持多種編程語言的環境配置,包括: Python:Anaconda默認安裝了Python和必需的Python庫,可以方便地進行Python編程和數據分析。 R:Anaconda也可以配置R語言環…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform? Terraform 是由 HashiCorp 創建的“基礎架構即代碼”(Infrastructure-as-Code,IaC)開源工具。Terraform 的配置語言是 HashiCorp Configuration Language(HCL),用來替代更加冗長的 JSON 和 XML 等…

SpringBoot注解--09--idea創建spring boot項目,java版本只能選擇17和21

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 idea創建spring boot項目1.問題描述2.原因3.解決方法方案一:升級JDK版本至17或更高方案二:替換Spring初始化的源https://start.aliyun.com i…

實時計算及異構計算隨筆筆記

3、異構計算的典型應用 異構計算并不神秘,目前已滲透各個領域,不僅是PC領域,也包括了手持移動設備領域、行業領域,甚至是云計算、分布式計算領域。事實上,異構計算至少在應用端(前臺)并不像它的…

Android 運行時權限

Android 6.0 及以后,如果你的應用需要用到一些危險權限,那么這些權限必須手動申請。 具體危險權限有哪些,可以通過下面這篇文章自行查詢到: 使用 adb 命令列出設備所有危險權限 例如,讀寫文件就涉及到兩個危險權限&am…

Unity 中獲取調用者方法名

介紹 在 Unity 開發中,有時需要在代碼中獲取當前方法的調用者方法名,以便進行日志記錄、調試等操作。本教程將詳細介紹如何使用 C# 中的 StackTrace 類來實現這一功能,并將其封裝成一個便捷的工具類,以方便在項目中的任何地方…

ES的安裝以及配置+ik分詞

環境:windows10、ES(8.13.3)、Kibana(8.13.3)、Logstash(8.13.3)、ik(8.13.3) 1.下載安裝ES Download Elasticsearch | ElasticDownload Elasticsearch or the complet…

AI預測體彩排3采取888=3策略+和值012路一縮定乾坤測試5月26日預測第2彈

今天繼續基于8883的大底進行測試,昨天的預測已成功命中!今天繼續測試,按照排三前面的規律,感覺要出對子了,所以本次預測不再殺對子,將采用殺一個和尾來代替。好了,直接上結果吧~ 首先&#xff0…

mongoengine,一個非常實用的 Python 庫!

更多Python學習內容:ipengtao.com 大家好,今天為大家分享一個超酷的 Python 庫 - mongoengine。 Github地址:https://github.com/MongoEngine/mongoengine 在現代應用程序開發中,NoSQL數據庫因其靈活性和高性能而廣受歡迎。MongoD…

軟件需求規范說明模板

每個軟件開發組織都會為自己的項目選用一個或多個標準的軟件需求規范說明模板。有許多軟件需求規范說明模板可以使用(例如ISO/IEC/IEEE2011;Robertson and Robertson2013)。如果你的組織要處理各種類型或規模的項目,例如新的大型系統開發或是對現有系統進行微調&…

concurrency 并行編程

Goroutine go語言的魅力所在,高并發。 線程是操作系統調度的一種執行路徑,用于在處理器執行我們在函數中編寫的代碼。一個進程從一個線程開始,即主線程,當該線程終止時,進程終止。這是因為主線程是應用程序的原點。然后…

紅黑樹封裝map和set

紅黑樹源代碼 我們將由下列的KV模型紅黑樹來模擬封裝STL庫中的map和set 注意&#xff1a;為了實現封裝map和set&#xff0c;我們需要對下列源碼進行優化。 #pragma once #include<iostream> using namespace std; //枚舉類型的顏色分類 enum Colour {RED,BLACK };//定…

【Python爬蟲】圖片驗證碼的處理

什么是圖片驗證碼&#xff1f; 驗證碼&#xff08;CAPTCHA&#xff09;是&#xff02;Completely Automated Public Turing test to tell Computers and HumansApart”&#xff08;全自動區分計算機和人類的圖靈測試&#xff09;的縮寫&#xff0c;是一種區分用戶是計算機還是人…

Markdown魔法手冊:解鎖高效寫作的新技能

邊使用邊更新0.0... 文章目錄 一、如何在Markdown中插入表情&#xff1f;二、文字樣式設置1.文本顏色設置2.文本字號設置3.文本字體設置4. 實戰演練5.黃色高亮 一、如何在Markdown中插入表情&#xff1f; 在Markdown中插入表情&#xff08;emoji&#xff09;的方法取決于你使用…

如何提升百度小程序的收錄?百度小程序如何做優化?

? 如何通過百度小程序獲得更多的自然流量&#xff1f;這是做百度小程序肯定要考慮的問題&#xff0c;做百度小程序的目的就是想借助百度生態&#xff0c;做相應的關鍵詞給自己的小程序引流&#xff0c;如何把流量給做起來呢&#xff0c;接下來我從不同的方面給大家進行分析講解…

最新ChatGpt Desktop for Mac 安裝使用教程

1. 下載地址 請點擊鏈接下載 ChatGPT Desktop for MacOS 2. 使用要求 MacOS 版本 14需要時M1芯片的&#xff0c;如果你是因特爾的暫時還還不行 就算下載了也會出現下面的異常 3. 獲取權限資格 目前 ChatGPT MacOS Desktop還不是全量開放的, 如果你沒有收到通知說明你還沒…

在 Dockerfile 中遇到了連接到 pypi.org 超時的問題

看起來你在 Dockerfile 中遇到了連接到 pypi.org 超時的問題。這可能是由于網絡連接問題導致的。你可以嘗試以下方法解決這個問題&#xff1a; 1. 更換鏡像源&#xff1a; 有時候 pypi.org 的訪問會受到地理位置或網絡環境的影響&#xff0c;你可以考慮使用國內的鏡像源來代…

Oracle的ROWID解析

目錄 一、ROWID基礎概念二、ROWID的類型三、ROWID的用途四、注意事項五、管理與監控 Oracle的ROWID是一個非常核心的概念&#xff0c;它代表了一行數據在數據庫中的物理位置標識。 一、ROWID基礎概念 唯一性與不變性&#xff1a;ROWID是每行數據的唯一標識符&#xff0c;它在行…