成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

啥是 MySQL 事務(wù)隔離級別?

數(shù)據(jù)庫 MySQL
如果我們使用的 MySQL 存儲引擎為 InnoDB ,并且其事務(wù)隔離級別是 RR 可重復(fù)讀的話,是可以避免幻讀的。

[[413071]]

本文轉(zhuǎn)載自微信公眾號「SH的全棧筆記」,作者SH的全棧筆記。轉(zhuǎn)載本文請聯(lián)系SH的全棧筆記公眾號。

之前發(fā)過一篇文章,簡單了解 MySQL 中相關(guān)的鎖,里面提到了,如果我們使用的 MySQL 存儲引擎為 InnoDB ,并且其事務(wù)隔離級別是 RR 可重復(fù)讀的話,是可以避免幻讀的。

但是沒想到,都 1202 年了都還有人杠,說 InnoDB 的 RR 隔離級別下會出現(xiàn)幻讀,只能依靠 gap 和 next-key 這兩個鎖來防止幻讀 ,最開始我還以為是他真的不知道這個點,就跟他聊,最后聊下來發(fā)現(xiàn),發(fā)現(xiàn)是在鉆牛角尖。

這個在下面講到 可重復(fù)讀 的隔離級別時會講。

本來我覺得事務(wù)隔離級別這玩意兒太簡單沒啥可講的,但是經(jīng)過了上面這件事,我打算詳細(xì)的把事務(wù)隔離給講講。接下來順便就把 InnoDB 所有的事務(wù)隔離級別給摟一遍。

ACID

在聊事務(wù)隔離級別之前,我們需要知道 ACID 模型。

ACID 模型

分別代表:

  • Atomicity 原子性
  • Consistency 一致性
  • Isolation 隔離型
  • Durability 持久性

原子性,代表 InnoDB 事務(wù)中,所有的操作要么全部成功,要么全部失敗,不會處于某個中間狀態(tài)。說的更通俗一點,如果事務(wù) A 失敗,其所做的所有的更改應(yīng)該全部回滾。

一致性,主要是保護(hù)數(shù)據(jù)的一致性,防止由于數(shù)據(jù)庫的崩潰而導(dǎo)致的數(shù)據(jù)一致性問題。舉個例子,我們更新 MySQL 的數(shù)據(jù),更新的數(shù)據(jù)會先到 InnoDB 的 Buffer Pool 中,如果此時 MySQL 所在的機器突然意外重啟了,如果 InnoDB 沒有崩潰恢復(fù)機制,之前更新的數(shù)據(jù)就會丟失,數(shù)據(jù)的一致性問題就出現(xiàn)了。

很多其他的博客寫的是事務(wù)開要始前后,數(shù)據(jù)的完整性沒有被破壞。我表示看了根本看不懂,太抽象了。

隔離性,主要是指事務(wù)之間的隔離,再具體一點,就是我們本篇文章要討論的事務(wù)隔離級別了。

持久性,主要是指我們新增或者刪除了某些數(shù)據(jù),一旦成功,這些操作應(yīng)該需要被持久化到磁盤上去。

ACID 模型可以理解成數(shù)據(jù)庫的設(shè)計范式,主要關(guān)注點在數(shù)據(jù)數(shù)據(jù)、及其本身的可靠性。而 MySQL 中的 InnoDB 就完全遵守 ACID 模型,并且在存儲引擎層就支持?jǐn)?shù)據(jù)一致性的校驗和崩潰恢復(fù)的機制。

而 ACID 中的隔離型,就是我們這篇文章中討論的重點。

事務(wù)隔離級別

有很多文章上來就直接介紹事務(wù)隔離級別的種類,這個種類啥意思,那個種類怎么用。但我認(rèn)為應(yīng)該先了解為什么需要事務(wù)隔離級別,以及事務(wù)隔離級別到底解決了什么問題,這才是關(guān)鍵。

我們知道 InnoDB 中同時會有多個事務(wù)對數(shù)據(jù)進(jìn)行操作,舉一些例子:

  • 假如事務(wù)A需要查詢 id=1 的數(shù)據(jù),但是事務(wù)A查詢完畢之后,事務(wù)B對 id=1 的數(shù)據(jù)做了更新,那此時事務(wù)A再次執(zhí)行查詢,應(yīng)該看到更新前的數(shù)據(jù)還是更新后的數(shù)據(jù)?
  • 或者還是上面那個例子,事務(wù)A讀取了事務(wù)B的數(shù)據(jù),但是如果事務(wù)B進(jìn)行回滾了怎么辦?事務(wù)A的數(shù)據(jù)不就變成了臟數(shù)據(jù)?
  • 又或者事務(wù)A讀取了 1-3點 的日程安排,有4條,但是事務(wù)A讀取完成后事務(wù)B又向 1-3 點這個時間段插入了一條新的安排,那么事務(wù)A如果再次讀取,應(yīng)該顯示4條日程安排還是5條?

以上的這些問題,就需要事務(wù)隔離級別來回答了。其實以上的三種情況分別對應(yīng)不可重復(fù)讀、臟讀和幻讀。InnoDB 通過事務(wù)隔離級別分別的解決了上面的問題。所有的事務(wù)隔離級別如下:

  • READ UNCOMMITTED 讀未提交
  • READ COMMITTED 讀已提交
  • REPEATABLE READ 可重復(fù)讀
  • SERIALIZABLE 串行化

InnoDB 默認(rèn)的事務(wù)隔離級別為 REPEATABLE READ 。

讀未提交

事務(wù)A讀取了事務(wù)B還未提交的數(shù)據(jù)

如果事務(wù)B此時出錯了進(jìn)行了回滾,那么事務(wù)A讀取到的數(shù)據(jù)就成為了臟數(shù)據(jù),從而造成臟讀。

如果事務(wù)B又更新事務(wù)A讀取的數(shù)據(jù),那么事務(wù)A再次讀取,讀取到了事務(wù)B修改的結(jié)果,這造成了不可重復(fù)讀。

而如果事務(wù)B又新增了數(shù)據(jù),事務(wù)A再次讀取,會讀取到事務(wù)B新增的數(shù)據(jù),這造成了幻讀。

所以總結(jié)來說,在讀未提交這個隔離級別下,會造成以下的問題:

  • 臟讀
  • 不可重復(fù)讀
  • 幻讀

讀已提交

事務(wù)A讀取了事務(wù)B已經(jīng)提交的數(shù)據(jù)

如果事務(wù)B更新了事務(wù)A讀取到的數(shù)據(jù),并且提交,那么當(dāng)事務(wù)A再次進(jìn)行讀取,就會讀取到其他事務(wù)的變更,就造成了不可重復(fù)讀。

同理,如果事務(wù)B新增了數(shù)據(jù)并且提交,事務(wù)A再次進(jìn)行讀取時拿到了事務(wù)B剛剛提交的數(shù)據(jù),這就造成了幻讀。

所以總結(jié)來說,在讀已提交的隔離級別下,會造成:

  • 不可重復(fù)讀
  • 幻讀

可重復(fù)讀

事務(wù)A不會讀取到事務(wù)B更新的數(shù)據(jù),也不會讀到事務(wù)B新增的數(shù)據(jù)

在可重復(fù)讀場景下,不會出現(xiàn)臟讀、不會出現(xiàn)不可重復(fù)讀,可能會出現(xiàn)幻讀。

無論事務(wù)B做了什么操作,事務(wù)A查詢到的 id=1 的數(shù)據(jù)都是張三。

但是,在某些情況下,還是可能會出現(xiàn) 幻讀。可重復(fù)讀 只是在某些情況下會產(chǎn)生幻讀,但絕對不是 InnoDB 無法避免幻讀。首先,InnoDB 在 RR 隔離級別下有很明確的解決幻讀的方式,那就是——臨鍵鎖,一種組合了 gap 鎖和記錄鎖的鎖。

接下來舉個例子來看在 RR 隔離級別下,什么情況會出現(xiàn)幻讀,什么情況下不會出現(xiàn)幻讀。首先是 可能會出現(xiàn)幻讀。

  1. SELECT * FROM `student` WHERE `id` > 1 

由于 InnoDB 有 MVCC 來進(jìn)行多事務(wù)的并發(fā),此時 SELECT 走的是快照讀,不會加鎖,那么臨鍵鎖就無法發(fā)揮其作用,如果有其他事務(wù)插入了一條數(shù)據(jù),那么事務(wù)再次執(zhí)行上面的語句是有可能會查出 id > 1 的數(shù)據(jù)。

但是如果顯示的進(jìn)行加鎖,則可以避免這個問題。

  1. SELECT * FROM `student` WHERE `id` > 1 FOR UPDATE 

至于為什么臨鍵鎖可以避免幻讀,之前的文章已經(jīng)聊的很清楚,就不在此贅述了。

串行化

所以事務(wù)被強制的串行執(zhí)行

這樣從根本上就避免了并發(fā)的問題,但是這樣會使得 MySQL 的性能下降。因為現(xiàn)在同一時間只能有一個事務(wù)在運行。

EOF

關(guān)于事務(wù)隔離級別就先介紹到這,之后有時間了就把 事務(wù)隔離級別 的底層原理給摟一遍。

 

責(zé)任編輯:武曉燕 來源: SH的全棧筆記
相關(guān)推薦

2021-08-04 13:19:42

MySQL 事務(wù)隔離

2018-12-19 16:46:38

MySQL事務(wù)隔離數(shù)據(jù)庫

2024-04-26 09:17:20

MySQL事務(wù)隔離

2024-12-02 08:37:04

2010-11-19 16:13:06

oracle事務(wù)隔離級

2009-06-29 17:54:47

Spring事務(wù)隔離

2021-10-19 10:10:51

MySQL事務(wù)隔離級別數(shù)據(jù)庫

2025-03-03 08:20:00

MySQL事務(wù)隔離數(shù)據(jù)庫

2022-06-10 11:51:49

MySQL事務(wù)隔離

2025-01-13 13:12:54

2020-10-13 10:32:24

MySQL事務(wù)MVCC

2021-01-18 11:49:26

面試事務(wù)隔離

2021-08-30 20:12:11

MySQL事務(wù)隔離

2022-09-13 13:49:05

數(shù)據(jù)庫隔離

2022-06-29 11:01:05

MySQL事務(wù)隔離級別

2020-09-21 18:44:35

MySQL

2019-10-15 10:23:13

服務(wù)器MySQL 數(shù)據(jù)

2023-02-02 07:06:10

2024-07-16 08:19:46

MySQL數(shù)據(jù)InnoDB

2017-08-09 14:34:12

MysqlJavaPython
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲www| 在线视频一区二区三区 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美mv日韩mv国产网站91进入 | 看av片网站| 91在线视频精品 | 欧美精品91 | 欧美xxxⅹ性欧美大片 | 365夜爽爽欧美性午夜免费视频 | 天天操天天干天天曰 | 放个毛片看看 | 久久青草av | 亚洲欧洲日韩 | a a毛片| 在线免费黄色小视频 | 欧美成人影院 | 免费亚洲成人 | 国产精品一区二区三区在线 | 我想看国产一级毛片 | av三级在线观看 | 日本在线一区二区三区 | 久久精品视频9 | 日韩高清不卡 | 9999国产精品欧美久久久久久 | 天堂成人国产精品一区 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产精品一区二区三区久久久 | 欧美精品tv | 国产精品99久久久久久久久 | 免费在线观看一区二区三区 | 成人婷婷 | 欧美黄色一区 | 特黄色一级毛片 | 亚洲精品一区二区三区 | 成人免费一区二区三区视频网站 | 免费国产一区二区 | 日韩第一区 | 在线小视频 | 成人做爰69片免费观看 | 日韩成人免费中文字幕 | 国产成人精品一区二区三区网站观看 |