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

一文讀懂數據庫并發三大“坑”:幻讀、臟讀和不可重復讀!

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

一、背景介紹

經常有面試官提出這么一個問題:什么是臟讀、幻讀和不可重復讀?

關于這個問題,我們還得從數據庫的管理系統說起,當數據庫管理系統在寫入或者更新數據的過程中,為了保證數據是正確可靠的,需要滿足四個特性:原子性一致性隔離性和持久性,簡稱 ACID !

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

例如以銀行轉賬為例,從原賬戶扣除金額,以及向目標賬戶添加金額,這兩個階段的操作,被視為一個完整的邏輯過程,不可拆分,簡單的說,要么全部成功,要么全部失敗!這個過程被稱為一個事務,具有 ACID 四個特點!

說了這么多,跟我們今天要說的臟讀、不可重復讀和幻讀有什么關系呢?

我們都知道,當下主流的數據庫,都支持多個事務并發執行,當一個事務在寫入數據,另一個事務也要讀這條數據,會出現哪些問題?當一個事務在寫入數據,另一個事務也要寫入這條數據,又會發生什么哪些問題?

當多個事務并發處理同一條數據時,如果事務隔離性不合理,就會產生我們今天要介紹的內容,具體的說就是:臟讀不可重復讀幻讀

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

  • read uncommitted:俗稱讀未提交,指的是一個事務還沒提交時,它做的變更就能被別的事務看到。
  • Read committed:俗稱讀提交,指的是一個事務提交之后,它做的變更才會被其他事務看到。
  • Repeatable read:俗稱可重復讀,指的是一個事務執行過程中看到的數據,總是跟這個事務在啟動時看到的數據是一致的,同時當其他事務在未提交時,變更是不可見的。
  • Serializable:俗稱串行化,顧名思義就是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。

不同的隔離級別,產生的結果是不一樣,下面我們一起來具體分析分析!

二、場景分析

2.1、臟讀

所謂的臟讀,指的是讀到了其他事務未提交的數據,未提交意味著這些數據可能會保存到數據庫,也可能會回滾,不保存到數據庫。當這個數據發生了回滾,就意味著這個數據不存在,這就是臟讀!

圖片

臟讀最大的問題就是可能會讀到不存在的數據。比如在上圖中,事務 B 的更新數據被事務 A 讀取,但是事務 B 回滾了,更新數據全部還原。也就是說事務 A 剛剛讀到的數據并沒有存在于數據庫中。

從結果上看,事務 A 讀出了一條不存在的數據,這個問題比較很嚴重!

當數據庫的事務隔離級別為讀未提交,就會發生臟讀現象!

2.2、不可重復讀

不可重復讀,指的是在一個事務內,最開始讀到的數據和事務結束前的任意時刻讀到的同一批數據出現不一致的情況。

圖片

比如上圖,事務 A 兩次讀取同一數據,第一次讀取結果為 1,當事務 B 修改了數據并提交,此時的事務 A 第二次讀取結果為 2,兩次讀取結果不一致!

當數據庫的事務隔離級別為讀未提交讀提交時,就會發生不可重復讀現象!

2.3、幻讀

幻讀和不可重復讀,有點類似,但是表達的側重點不一樣。

例如事務 A 對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。此時,突然事務 B 插入了一條數據并提交了,當事務 A 提交了修改數據操作之后,再次讀取全部數據,結果發現還有一條數據未更新,給人感覺好像產生了幻覺一樣。這就是幻讀!

圖片圖片

當有別的事務,在插入或者刪除同一條數據的時候,就容易產生幻讀的現象!

當數據庫的事務隔離級別為讀未提交讀提交可重復讀時,就會發生幻讀現象!

三、如何解決

為了解決上述問題,數據庫通過鎖機制來解決并發訪問的問題。

以 Mysql 為例,根據鎖定對象不同,分為:行級鎖和表級鎖;根據并發事務鎖定的關系上看,分為:共享鎖定和獨占鎖定

共享鎖定會防止獨占鎖定,但允許其他的共享鎖定;而獨占鎖定既防止共享鎖定也能防止其他獨占鎖定;為了更改數據,數據庫在進行更改的行上施加了行級獨占鎖定,insertupdatedeleteselsct for update語句都會隱式采用必要的行鎖定,當沖突加劇,會上升到表級鎖定,此時會影響到其他表的訪問操作。

直接使用鎖機制管理是很復雜的,基于鎖機制,數據庫給用戶提供了不同的事務隔離級別,只要設置了事務隔離級別,數據庫就會分析事務中的 sql 語句然后自動選擇合適的鎖,可以依次有效的解決臟讀、不可重復讀和幻讀問題!

圖片圖片

整體的來說,事務的隔離級別和數據庫并發性是成反比的,隔離級別越高,并發性越低。

四、小結

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

五、參考

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

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

責任編輯:武曉燕 來源: 潘志的技術筆記
相關推薦

2022-04-27 07:32:02

臟讀幻讀不可重復讀

2019-03-21 09:06:00

數據庫復讀幻讀

2024-04-19 08:18:47

MySQLSQL隔離

2024-04-24 08:26:35

事務數據InnoDB

2022-01-03 07:18:05

臟讀幻讀 MySQL

2023-11-01 14:13:00

MySQL事務隔離級別

2018-01-03 09:02:13

不可重復讀幻讀MySQL

2023-02-02 07:06:10

2021-08-02 09:01:05

MySQL 多版本并發數據庫

2022-06-29 11:01:05

MySQL事務隔離級別

2023-10-26 00:41:46

臟讀數據幻讀

2024-07-16 08:19:46

MySQL數據InnoDB

2024-05-13 11:46:33

MySQL數據庫

2021-09-07 10:33:42

MySQL事務隔離性

2021-04-20 19:21:50

臟讀MySQL幻讀

2019-05-28 13:50:27

MySQL幻讀數據庫

2023-12-26 08:08:02

Spring事務MySQL

2019-12-24 14:50:01

MySQL可重復讀數據庫

2022-10-20 08:01:23

2023-08-09 17:22:30

MVCCMySQL數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰成人免费 | 中文字幕高清视频 | 男人天堂久久久 | 日本特黄特色aaa大片免费 | 日韩欧美福利视频 | 成人a视频在线观看 | 在线观看国产精品视频 | 国产九九精品视频 | 欧美一区二区在线播放 | 午夜影院在线免费观看视频 | 蜜臀久久99精品久久久久野外 | 91日日| 一级做a | 污污的网站在线观看 | 欧美一区二区免费在线 | 亚洲第一成年免费网站 | 午夜丰满寂寞少妇精品 | 色桃网 | 福利影院在线看 | 国产精品精品视频一区二区三区 | 国产九九九九 | 91一区二区 | 中文字幕国产在线 | 天天看片天天干 | 日本不卡免费新一二三区 | 精品中文字幕久久 | 玖玖视频网 | 午夜激情免费视频 | 久久综合一区二区三区 | 一区二区在线免费观看 | 不卡的av电影| a级黄色网 | 欧美专区在线 | 亚洲午夜精品一区二区三区他趣 | 日本在线视频一区二区 | 欧美高清视频一区 | 日韩欧美在线免费观看视频 | 久久久tv | 久久精品综合 | 精品乱码久久久久 | 亚洲国产精品99久久久久久久久 |