91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql數據庫底層原理是什么

發布時間:2023-04-20 17:21:18 來源:億速云 閱讀:125 作者:iii 欄目:MySQL數據庫

這篇“mysql數據庫底層原理是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“mysql數據庫底層原理是什么”文章吧。

1.數據庫事務的基本特性。

原子性:

事務中的所有操作要么全部提交成功,要么全部失敗回滾。

場景:UPDATE cs_user SET age = 18 , gender = '女' WHERE id = 4。要么全部更新要么更新失敗,不會出現age更新成功,gender更新失敗。

一致性

據庫總是從給一個一致性的狀態轉換到另一個一致性的狀態。

場景:比如規定某個表的字段age大于等于12小于18時,字段type為青少年,而數據庫中存在age=16的時候,type='兒童'。

隔離性:

一個事務所做的修改在提交之前對其它事務是不可見的。兩個以上的事務不會出現交錯執行的狀態.因為這樣可能會導致數據不一致。

持久性:

一旦事務提交,其所做的修改便會永久保存在數據庫中。

事務在并發環境下出現的問題。

臟讀(Dirty Read):一個事務讀取了另一個事務未提交的數據。如果另一個事務回滾,則讀取的數據將是無效的。

不可重復讀(Non-repeatable Read):同一事務內,兩次讀取同一數據得到的結果不同。這是因為在兩次讀取之間,另一個事務修改了該數據。

幻讀(Phantom Read):同一事務內,兩次查詢得到的結果集不同。這是因為在兩次查詢之間,另一個事務插入或刪除了一些數據。

丟失修改(Lost Update):兩個或多個事務同時修改同一數據,其中一個事務的修改被另一個事務覆蓋,導致修改丟失。

不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

對于這些問題的解決方法一般是有:事務隔離級別,樂觀鎖和悲觀鎖,MVCC(多版本并發控制)。

事務隔離級別

數據庫提供了多種事務隔離級別,不同的隔離級別提供了不同的并發控制機制,以解決并發問題。

以下是數據庫的每一個事務隔離級別的詳細介紹:

READ UNCOMMITTED(讀未提交):該隔離級別允許事務讀取其他事務未提交的數據,可能會出現臟讀、不可重復讀和幻讀的問題。

READ COMMITTED(讀已提交):該隔離級別只允許事務讀取其他事務已提交的數據,可以避免臟讀問題,但不可避免不可重復讀和幻讀的問題。

REPEATABLE READ(可重復讀):該隔離級別保證在同一事務中多次讀取同一數據得到的結果是一致的,可以避免臟讀和不可重復讀的問題,但無法避免幻讀。

SERIALIZABLE(串行化):該隔離級別保證事務串行執行,避免了以上所有并發問題,但會影響并發性能。

READ UNCOMMITTED(讀未提交)

在READ UNCOMMITTED級別下,事務可以讀取未提交的數據,沒有對數據進行加鎖或版本控制。當一個事務讀取數據時,即使另一個事務正在修改該數據,也不會阻塞讀取操作。這種實現方式可以提高讀取性能,但會導致臟讀的問題。

優點:

讀取性能高:由于不需要加鎖或版本控制,因此讀取性能較高。

無鎖操作:該隔離級別不需要對數據進行加鎖操作,因此可以避免鎖的競爭問題。

缺點:

臟讀問題:在READ UNCOMMITTED級別下,事務可以讀取其他事務未提交的數據,因此可能會讀取到無效數據,導致臟讀的問題。

不可重復讀問題:由于其他事務可以修改數據,因此同一事務內兩次讀取同一數據得到的結果可能不同。

幻讀問題:由于其他事務可以插入或刪除數據,因此同一事務內兩次查詢得到的結果集可能不同。可能導致數據不一致:由于讀取的數據可能是未提交的數據,因此可能會導致數據不一致的問題。

對于這個隔離級別,幾乎無法解決任何對于數據庫并發環境下數據不一致的錯誤,但在一些對數據一致性要求不高,但讀取性能要求較高的系統中,可以考慮使用該隔離級別。

READ COMMITTED(讀已提交)

在READ COMMITTED級別下,事務只能讀取已提交的數據,需要對數據進行加鎖或版本控制。當一個事務讀取數據時,如果另一個事務正在修改該數據,則需要等待該事務提交后才能讀取。這種實現方式可以避免臟讀的問題,但可能會無法避免不可重復讀和幻讀的問題。

優點:

避免臟讀問題:由于只允許讀取已提交的數據,因此可以避免臟讀的問題。

數據一致性較高:由于只讀取已提交的數據,因此數據一致性較高。

缺點:

不可重復讀問題:由于其他事務可以修改數據,因此同一事務內兩次讀取同一數據得到的結果可能不同。

幻讀問題:由于其他事務可以插入或刪除數據,因此同一事務內兩次查詢得到的結果集可能不同。

鎖的競爭問題:由于需要對數據進行加鎖,因此可能會導致鎖的競爭問題。

這個隔離級別解決了一部分并發問題,但是還有一部分問題沒有解決,適合應用于對數據一致性要求較高的系統。如果需要更高的隔離級別,可以考慮使用REPEATABLE READ或SERIALIZABLE級別。

REPEATABLE READ(可重復讀)

在InnoDB中是這樣的:RR隔離級別保證對讀取到的記錄加鎖 (記錄鎖),同時保證對讀取的范圍加鎖,新的滿足查詢條件的記錄不能夠插入 (間隙鎖),因此不存在幻讀現象。但是標準的RR只能保證在同一事務中多次讀取同樣記錄的結果是一致的,而無法解決幻讀問題。InnoDB的幻讀解決是依靠MVCC的實現機制做到的。Mysql默認的隔離級別是RR。

優點:

避免臟讀和不可重復讀問題:由于需要對數據進行版本控制,因此可以避免臟讀和不可重復讀的問題。

數據一致性較高:由于保證了同一事務內多次讀取同一數據得到的結果一致,因此數據一致性較高。

缺點:

鎖的競爭問題:由于需要對數據進行版本控制,因此可能會導致鎖的競爭問題。

版本控制開銷:由于需要對數據進行版本控制,因此可能會增加數據庫的存儲和計算開銷。

幻讀解決

InnoDB的幻讀解決是依靠MVCC的實現機制: (增加系統版本號,每次事務操作,會比較系統版本號) InnoDB為每行記錄添加了一個版本號(系統版本號),每當修改數據時,版本號加一。在讀取事務開始時,系統會給事務一個當前版本號,事務會讀取版本號<=當前版本號的數據,這時就算另一個事務插入一個數據,并立馬提交,新插入這條數據的版本號會比讀取事務的版本號高,因此讀取事務讀的數據還是不會變。例如:此時books表中有5條數據,版本號為1 事務A,系統版本號2:select * from books;因為1<=2所以此時會讀取5條數據。 事務B,系統版本號3:insert into books ...,插入一條數據,新插入的數據版本號為3,而其他的數據的版本號仍然是2,插入完成之后commit,事務結束。 事務A,系統版本號2:再次select * from books;只能讀取<=2的數據,事務B新插入的那條數據版本號為3,因此讀不出來,解決了幻讀的問題,而且兩個事務同時修改同一數據,則會生成兩個不同的版本,從而避免數據丟失的問題,解決了丟失修改問題。

mysql鎖

在mysql中使用的鎖一般是兩種類型,樂觀鎖和悲觀鎖。

樂觀鎖概念

是由我們自己實現的一個版本控制。在表中的數據進行操作時(更新),先給數據表加一個版本(version)字段,每操作一次,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version字段,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,將version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作

悲觀鎖概念

這個由數據庫實現,對于悲觀鎖在操作數據時,認為此操作會出現數據沖突,所以在進行每次操作時都要通過獲取鎖才能進行對相同數據的操作。在悲觀鎖中又有兩種類型,分別是共享鎖與排它鎖。

共享鎖(讀鎖)

對于共享鎖來說,他的作用是在一個事務對數據A加上共享鎖后,其他的事務只能在對數據A加共享鎖,無法加其他鎖,只有全部共享鎖釋放后才能加其他鎖(基本上就是排它鎖)。這句話的意思其實就是,有一個事務正在讀數據A,那么其他事務也只能讀數據A,而無法修改數據A,只有在所有事務對數據A的訪問都完成后,才能進行修改。

排它鎖(寫鎖)

對于排它鎖來說,作用是在一個事務對數據A加上排它鎖后,只有這個事務可以對數據進行讀取和修改,其他的事務都無法對這個數據進行讀取和修改,當然也無法對這個數據加鎖。

使用方式:在需要執行的語句后面加上for update就可以了

行鎖和表鎖

對于悲觀鎖來說

有行鎖和表鎖兩種區別,

行鎖是給某一行加上鎖,也就是一條記錄加上鎖。

行級鎖都是基于索引的,如果一條SQL語句用不到索引是不會使用行級鎖的,會使用表級鎖(這也是為什么sql語句盡量保證走索引原因之一)

表鎖:沒有使用索引的情況是鎖定全表的。

死鎖

死鎖(Deadlock) 所謂死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。

以上就是關于“mysql數據庫底層原理是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上栗县| 庆阳市| 高清| 高州市| 凤庆县| 邵阳县| 碌曲县| 庆城县| 个旧市| 肇庆市| 景东| 陇南市| 桃江县| 阿鲁科尔沁旗| 花莲市| 都江堰市| 原阳县| 沙湾县| 石屏县| 台北市| 嘉兴市| 盐津县| 阜新市| 孟津县| 简阳市| 唐海县| 高唐县| 乐安县| 平乐县| 潮州市| 宜城市| 禹州市| 安福县| 商城县| 郑州市| 湖口县| 枣强县| 富民县| 增城市| 峡江县| 古浪县|