自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文讀懂?dāng)?shù)據(jù)庫(kù)并發(fā)三大“坑”:幻讀、臟讀和不可重復(fù)讀!

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
在事務(wù)的四個(gè)特性里面,其中隔離性總共分為四種級(jí)別:由低到高依次為 Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個(gè)級(jí)別可以逐個(gè)解決臟讀 、不可重復(fù)讀 、幻讀等這幾類(lèi)問(wèn)題。

一、背景介紹

經(jīng)常有面試官提出這么一個(gè)問(wèn)題:什么是臟讀、幻讀和不可重復(fù)讀?

關(guān)于這個(gè)問(wèn)題,我們還得從數(shù)據(jù)庫(kù)的管理系統(tǒng)說(shuō)起,當(dāng)數(shù)據(jù)庫(kù)管理系統(tǒng)在寫(xiě)入或者更新數(shù)據(jù)的過(guò)程中,為了保證數(shù)據(jù)是正確可靠的,需要滿(mǎn)足四個(gè)特性:原子性一致性、隔離性和持久性,簡(jiǎn)稱(chēng) ACID !

  • Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,能被恢復(fù)(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
  • Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。這表示寫(xiě)入之前和寫(xiě)入之后的數(shù)據(jù)必須完全符合預(yù)期設(shè)定的結(jié)果。
  • Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。

例如以銀行轉(zhuǎn)賬為例,從原賬戶(hù)扣除金額,以及向目標(biāo)賬戶(hù)添加金額,這兩個(gè)階段的操作,被視為一個(gè)完整的邏輯過(guò)程,不可拆分,簡(jiǎn)單的說(shuō),要么全部成功,要么全部失??!這個(gè)過(guò)程被稱(chēng)為一個(gè)事務(wù),具有 ACID 四個(gè)特點(diǎn)!

說(shuō)了這么多,跟我們今天要說(shuō)的臟讀、不可重復(fù)讀和幻讀有什么關(guān)系呢?

我們都知道,當(dāng)下主流的數(shù)據(jù)庫(kù),都支持多個(gè)事務(wù)并發(fā)執(zhí)行,當(dāng)一個(gè)事務(wù)在寫(xiě)入數(shù)據(jù),另一個(gè)事務(wù)也要讀這條數(shù)據(jù),會(huì)出現(xiàn)哪些問(wèn)題?當(dāng)一個(gè)事務(wù)在寫(xiě)入數(shù)據(jù),另一個(gè)事務(wù)也要寫(xiě)入這條數(shù)據(jù),又會(huì)發(fā)生什么哪些問(wèn)題?

當(dāng)多個(gè)事務(wù)并發(fā)處理同一條數(shù)據(jù)時(shí),如果事務(wù)隔離性不合理,就會(huì)產(chǎn)生我們今天要介紹的內(nèi)容,具體的說(shuō)就是:臟讀不可重復(fù)讀幻讀!

在事務(wù)的四個(gè)特性里面,其中隔離性總共分為四種級(jí)別:由低到高依次為 Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個(gè)級(jí)別可以逐個(gè)解決臟讀 、不可重復(fù)讀 、幻讀等這幾類(lèi)問(wèn)題。

  • read uncommitted:俗稱(chēng)讀未提交,指的是一個(gè)事務(wù)還沒(méi)提交時(shí),它做的變更就能被別的事務(wù)看到。
  • Read committed:俗稱(chēng)讀提交,指的是一個(gè)事務(wù)提交之后,它做的變更才會(huì)被其他事務(wù)看到。
  • Repeatable read:俗稱(chēng)可重復(fù)讀,指的是一個(gè)事務(wù)執(zhí)行過(guò)程中看到的數(shù)據(jù),總是跟這個(gè)事務(wù)在啟動(dòng)時(shí)看到的數(shù)據(jù)是一致的,同時(shí)當(dāng)其他事務(wù)在未提交時(shí),變更是不可見(jiàn)的。
  • Serializable:俗稱(chēng)串行化,顧名思義就是對(duì)于同一行記錄,“寫(xiě)”會(huì)加“寫(xiě)鎖”,“讀”會(huì)加“讀鎖”。當(dāng)出現(xiàn)讀寫(xiě)鎖沖突的時(shí)候,后訪問(wèn)的事務(wù)必須等前一個(gè)事務(wù)執(zhí)行完成,才能繼續(xù)執(zhí)行。

不同的隔離級(jí)別,產(chǎn)生的結(jié)果是不一樣,下面我們一起來(lái)具體分析分析!

二、場(chǎng)景分析

2.1、臟讀

所謂的臟讀,指的是讀到了其他事務(wù)未提交的數(shù)據(jù),未提交意味著這些數(shù)據(jù)可能會(huì)保存到數(shù)據(jù)庫(kù),也可能會(huì)回滾,不保存到數(shù)據(jù)庫(kù)。當(dāng)這個(gè)數(shù)據(jù)發(fā)生了回滾,就意味著這個(gè)數(shù)據(jù)不存在,這就是臟讀!

圖片

臟讀最大的問(wèn)題就是可能會(huì)讀到不存在的數(shù)據(jù)。比如在上圖中,事務(wù) B 的更新數(shù)據(jù)被事務(wù) A 讀取,但是事務(wù) B 回滾了,更新數(shù)據(jù)全部還原。也就是說(shuō)事務(wù) A 剛剛讀到的數(shù)據(jù)并沒(méi)有存在于數(shù)據(jù)庫(kù)中。

從結(jié)果上看,事務(wù) A 讀出了一條不存在的數(shù)據(jù),這個(gè)問(wèn)題比較很?chē)?yán)重!

當(dāng)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別為讀未提交,就會(huì)發(fā)生臟讀現(xiàn)象!

2.2、不可重復(fù)讀

不可重復(fù)讀,指的是在一個(gè)事務(wù)內(nèi),最開(kāi)始讀到的數(shù)據(jù)和事務(wù)結(jié)束前的任意時(shí)刻讀到的同一批數(shù)據(jù)出現(xiàn)不一致的情況。

圖片

比如上圖,事務(wù) A 兩次讀取同一數(shù)據(jù),第一次讀取結(jié)果為 1,當(dāng)事務(wù) B 修改了數(shù)據(jù)并提交,此時(shí)的事務(wù) A 第二次讀取結(jié)果為 2,兩次讀取結(jié)果不一致!

當(dāng)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別為讀未提交、讀提交時(shí),就會(huì)發(fā)生不可重復(fù)讀現(xiàn)象!

2.3、幻讀

幻讀和不可重復(fù)讀,有點(diǎn)類(lèi)似,但是表達(dá)的側(cè)重點(diǎn)不一樣。

例如事務(wù) A 對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。此時(shí),突然事務(wù) B 插入了一條數(shù)據(jù)并提交了,當(dāng)事務(wù) A 提交了修改數(shù)據(jù)操作之后,再次讀取全部數(shù)據(jù),結(jié)果發(fā)現(xiàn)還有一條數(shù)據(jù)未更新,給人感覺(jué)好像產(chǎn)生了幻覺(jué)一樣。這就是幻讀!

圖片圖片

當(dāng)有別的事務(wù),在插入或者刪除同一條數(shù)據(jù)的時(shí)候,就容易產(chǎn)生幻讀的現(xiàn)象!

當(dāng)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別為讀未提交、讀提交可重復(fù)讀時(shí),就會(huì)發(fā)生幻讀現(xiàn)象!

三、如何解決

為了解決上述問(wèn)題,數(shù)據(jù)庫(kù)通過(guò)鎖機(jī)制來(lái)解決并發(fā)訪問(wèn)的問(wèn)題。

以 Mysql 為例,根據(jù)鎖定對(duì)象不同,分為:行級(jí)鎖和表級(jí)鎖;根據(jù)并發(fā)事務(wù)鎖定的關(guān)系上看,分為:共享鎖定和獨(dú)占鎖定。

共享鎖定會(huì)防止獨(dú)占鎖定,但允許其他的共享鎖定;而獨(dú)占鎖定既防止共享鎖定也能防止其他獨(dú)占鎖定;為了更改數(shù)據(jù),數(shù)據(jù)庫(kù)在進(jìn)行更改的行上施加了行級(jí)獨(dú)占鎖定,insertupdate、deleteselsct for update語(yǔ)句都會(huì)隱式采用必要的行鎖定,當(dāng)沖突加劇,會(huì)上升到表級(jí)鎖定,此時(shí)會(huì)影響到其他表的訪問(wèn)操作。

直接使用鎖機(jī)制管理是很復(fù)雜的,基于鎖機(jī)制,數(shù)據(jù)庫(kù)給用戶(hù)提供了不同的事務(wù)隔離級(jí)別,只要設(shè)置了事務(wù)隔離級(jí)別,數(shù)據(jù)庫(kù)就會(huì)分析事務(wù)中的 sql 語(yǔ)句然后自動(dòng)選擇合適的鎖,可以依次有效的解決臟讀、不可重復(fù)讀和幻讀問(wèn)題!

圖片圖片

整體的來(lái)說(shuō),事務(wù)的隔離級(jí)別和數(shù)據(jù)庫(kù)并發(fā)性是成反比的,隔離級(jí)別越高,并發(fā)性越低。

四、小結(jié)

本位主要圍繞什么是臟讀、不可重復(fù)讀和幻讀,進(jìn)行了簡(jiǎn)單的介紹,如果有些地方描述不對(duì),歡迎大家留言指出!

五、參考

1、https://baijiahao.baidu.com/s?id=1717095300761675602

2、https://blog.csdn.net/qq_41776884/article/details/81608777

責(zé)任編輯:武曉燕 來(lái)源: 潘志的技術(shù)筆記
相關(guān)推薦

2022-04-27 07:32:02

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

2019-03-21 09:06:00

數(shù)據(jù)庫(kù)復(fù)讀幻讀

2024-04-19 08:18:47

MySQLSQL隔離

2024-04-24 08:26:35

事務(wù)數(shù)據(jù)InnoDB

2022-01-03 07:18:05

臟讀幻讀 MySQL

2023-11-01 14:13:00

MySQL事務(wù)隔離級(jí)別

2018-01-03 09:02:13

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

2023-02-02 07:06:10

2022-06-29 11:01:05

MySQL事務(wù)隔離級(jí)別

2021-08-02 09:01:05

MySQL 多版本并發(fā)數(shù)據(jù)庫(kù)

2023-10-26 00:41:46

臟讀數(shù)據(jù)幻讀

2021-09-07 10:33:42

MySQL事務(wù)隔離性

2024-07-16 08:19:46

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

2024-05-13 11:46:33

MySQL數(shù)據(jù)庫(kù)

2021-04-20 19:21:50

臟讀MySQL幻讀

2019-05-28 13:50:27

MySQL幻讀數(shù)據(jù)庫(kù)

2023-12-26 08:08:02

Spring事務(wù)MySQL

2019-12-24 14:50:01

MySQL可重復(fù)讀數(shù)據(jù)庫(kù)

2023-08-09 17:22:30

MVCCMySQL數(shù)據(jù)

2022-10-20 08:01:23

點(diǎn)贊
收藏

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