MySQL進階之路(十二)——事務的4種隔離級别分别是什麼
一、概述
在上一篇文章中給大家詳細介紹了多個事務并發執行的場景下出現髒寫、髒讀、不可重複讀和幻讀的原因,本篇文章将會給大家詳細介紹MySQL為了防止上述情況的發生分别是如何去做的
回顧之前所學的,事務具有ACID四種特性,其中
I
指的是事務的隔離性,對于隔離性,又有不同的隔離級别,不同的隔離級别本質上其實是在事務同時進行更改或查詢操作時在結果的性能、可靠性、一緻性和可再現性之間所作的取舍不同而已。
InnoDB支援的隔離級别有:SERIALIZABLE、 REPEATABLE READ、 READ COMMITTED和 READ UNCOMMITTED,對于的中文意思分别是:可串行化、可重複度、讀已送出、讀未送出。InnoDB預設的隔離級别是REPEATABLE READ。下面我們對這幾個事務逐個進項分析
二、READ UNCOMMITTED(讀未送出)
在這種隔離級别下,事務可以讀到其他事物還沒有送出的值,在這種情況下不會發生髒寫,因為兩個未送出的事務不可能會讀取到同一行資料的值,其中一個事務讀到的是另一個事物未送出的值。
在這種隔離級别之下,肯定會發生髒讀,不可重複度以及幻讀
這種隔離級别僅僅适用于隻進行查詢操作的場景,是以,該隔離級别可以說是基本上沒多少地方會用到
三、READ COMMITTED(讀已送出)
該隔離級别之下,事務隻能讀取到其他事物以及送出的資料,對于未送出的
髒資料
是讀取不到的,是以不會發生髒寫和髒讀、但是會發生不可重複度和幻讀。
原因很簡單,本事物執行多次的讀操縱,讀到的可能都是已經送出并且不相同的資料,是以會發生不可重複度,發生幻讀的原因也很簡單,你進行範圍查詢的時候,其他事物插入新的資料并且送出。
四、REPEATABLE READ(可重複讀)
顧名思義,在一個事物送出之前對同一個資料進行多次的查詢,每次查詢到的值都是一樣的,即便在此期間有其他事物對該資料進行了修改并且已經送出也不會影響。這也是InnoDB引擎預設的隔離級别。
在這種情況下不會發生髒讀、髒寫和不可重複讀。可能會發生幻讀,因為雖然可以重複的讀取到相同的值,但是不能避免在進行範圍查詢時讀取到不同數量的值。
五、SERIALIZABLE(可串行化)
這個隔離級别就比較簡單粗暴了,在此隔離級别之下,所有事物隻能串行的進行,不能并發的執行,在這隔離級别之下,髒寫、髒讀、不可重複讀和幻讀都不會發生,但是缺點很明顯,性能極其的差!是以這種隔離級别在平時工作中幾乎是用不到的
六、小結
上述的隔離界别其實都有他們的簡稱,比如RU、RC、RR,其中最重要的就是RC和RR了,而RU和SERIALIZABLE因為幾乎用不到,是以不用太過于去關注。
之後的文章,将會給大家詳細地去介紹,上述的幾種隔離級别的實作原理。如果本篇文章有講的不對的地方,歡迎指出。