日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

个人对于MySQL的理解_MySQL锁的理解

發布時間:2025/3/12 数据库 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 个人对于MySQL的理解_MySQL锁的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、事務四要素:ACID原子性(Atomicity):要么做完,要么啥都不做,沒有中間狀態

一致性(Consistency):這個是個比較有爭議的概念,個人理解是通過AID來保證數據正確性,保證從一個狀態到下一個狀態是正確的;

隔離性(Isolation):并發事務之間不會互相影響,設立了不同程度的隔離級別,通過適度的破壞一致性,得以提高性能;

持久性(Durability):事務提交后數據不可逆并持久化存儲

二、事務并發問題臟讀, 沒有提交的事務能被其他事務讀取到

提交讀, 提交的事務能被其他事務讀取到

重復讀, 事務開始后,在本事務內,讀取的數據是一致的

幻讀, 事務內讀取到的記錄數量不一樣

丟失更新,事務保存或者回滾時覆蓋數據

三、隔離實現方式

傳統的隔離級別是基于鎖實現的,這種方式叫做 基于鎖的并發控制(Lock-Based Concurrent Control,簡寫 LBCC)。通過對讀寫操作加不同的鎖,以及對釋放鎖的時機進行不同的控制,就可以實現四種隔離級別。傳統的鎖有兩種:讀操作通常加共享鎖(Share locks,S鎖,又叫讀鎖),寫操作加排它鎖(Exclusive locks,X鎖,又叫寫鎖);加了共享鎖的記錄,其他事務也可以讀,但不能寫;加了排它鎖的記錄,其他事務既不能讀,也不能寫。另外,對于鎖的粒度,又分為行鎖和表鎖,行鎖只鎖某行記錄,對其他行的操作不受影響,表鎖會鎖住整張表,所有對這個表的操作都受影響。

歸納起來,四種隔離級別的加鎖策略如下:讀未提交(Read Uncommitted):事務讀不阻塞其他事務讀和寫,事務寫阻塞其他事務寫但不阻塞讀;通過對寫操作加 “持續X鎖”,對讀操作不加鎖 實現;

讀已提交(Read Committed):事務讀不會阻塞其他事務讀和寫,事務寫會阻塞其他事務讀和寫;通過對寫操作加 “持續X鎖”,對讀操作加 “臨時S鎖” 實現;不會出現臟讀;

可重復讀(Repeatable Read):事務讀會阻塞其他事務事務寫但不阻塞讀,事務寫會阻塞其他事務讀和寫;通過對寫操作加 “持續X鎖”,對讀操作加 “持續S鎖” 實現;

序列化(Serializable):為了解決幻讀問題,行級鎖做不到,需使用表級鎖。

四、MySQL隔離實現

雖然數據庫的四種隔離級別通過 LBCC 技術都可以實現,但是它最大的問題是它只實現了并發的讀讀,對于并發的讀寫還是沖突的,寫時不能讀,讀時不能寫,當讀寫操作都很頻繁時,數據庫的并發性將大大降低,針對這種場景,MVCC 技術應運而生。MVCC 的全稱叫做Multi-Version Concurrent Control(多版本并發控制),InnoDb 會為每一行記錄增加幾個隱含的“輔助字段”,(實際上是 3 個字段:一個隱式的 ID 字段,一個事務 ID,還有一個回滾指針),事務在寫一條記錄時會將其拷貝一份生成這條記錄的一個原始拷貝,寫操作同樣還是會對原記錄加鎖,但是讀操作會讀取未加鎖的新記錄,這就保證了讀寫并行。要注意的是,生成的新版本其實就是undo log,它也是實現事務回滾的關鍵技術。

InnoDb 通過 MVCC 實現了讀寫并行,但是在不同的隔離級別下,讀的方式也是有所區別的。首先要特別指出的是,在 read uncommit 隔離級別下,每次都是讀取最新版本的數據行,所以不能用 MVCC 的多版本,而 serializable 隔離級別每次讀取操作都會為記錄加上讀鎖,也和 MVCC 不兼容,所以只有 RC 和 RR 這兩個隔離級別才有 MVCC。

盡管 RR 和 RC 隔離級別都實現了 MVCC 來滿足讀寫并行,但是讀的實現方式是不一樣的:RC 總是讀取記錄的最新版本,如果該記錄被鎖住,則讀取該記錄最新的一次快照,而 RR 是讀取該記錄事務開始時的那個版本。雖然這兩種讀取方式不一樣,但是它們讀取的都是快照數據,并不會被寫操作阻塞,所以這種讀操作稱為快照讀(Snapshot Read)

除了快照讀,MySQL 還提供了另一種讀取方式:當前讀(Current Read),有時候又叫做加鎖讀(Locking Read)或者阻塞讀(Blocking Read),這種讀操作讀的不再是數據的快照版本,而是數據的最新版本,并會對數據加鎖

關于 MySQL 不同的隔離級別,讀操作的差異總結起來如下圖所示(其中,讀未提交和可序列化都和 MVCC 不兼容,可以暫且認為它們都屬于當前讀):

總結

以上是生活随笔為你收集整理的个人对于MySQL的理解_MySQL锁的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。