五分鐘搞清楚MySQL事務隔離級別

2021-09-07 10:22:42 字數 3534 閱讀 1261

好久沒碰資料庫了,只是想起自己當時在搞資料庫的時候在事務隔離級別這塊老是卡,似懂非懂的。現在想把這塊整理出來,盡量用最簡潔的語言描述出來,供新人參考。

首先建立乙個表account。建立表的過程略過(由於innodb儲存引擎支援事務,所以將表的儲存引擎設定為innodb)。表的結構如下:

表結構

然後往表中插入兩條資料,插入後結果如下:

資料

為了說明問題,我們開啟兩個控制台分別進行登入來模擬兩個使用者(暫且成為使用者a和使用者b吧),並設定當前mysql會話的事務隔離級別。

具體使用者a的操作如下:

set session transaction isolation level read uncommitted; start transaction; select * from account;

結果如下:

資料

使用者b的操作如下:

set session transaction isolation level read uncommitted; start transaction; update account set account=account+200 where id = 1;

隨後我們在a使用者中查詢資料,結果如下:

uncommitteda資料

那麼這麼做有什麼問題嗎?

那就是我們在乙個事務中可以隨隨便便讀取到其他事務未提交的資料,這還是比較麻煩的,我們叫髒讀。我不知道這個名字是怎麼起的,為了增強大家的印象,可以這麼想,這個事務好輕浮啊,飢渴到連別人沒提交的東西都等不及,真髒,呸!

實際上我們的資料改變了嗎?

答案是否定的,因為只有事務commit後才會更新到資料庫。

同樣的辦法,我們將使用者b所在的會話當前事務隔離級別設定為read commited。

在使用者a所在的會話中我們執行下面操作:

我們將id=1的使用者account減200。然後查詢,發現id=1的使用者account變為800。

在b使用者所在的會話中查詢:

select * from account;

結果如下:

我們會發現資料並沒有變,還是1000。

接著在會話a中我們將事務提交:

commit;
在會話b中查詢結果如下:

那麼這麼做有什麼問題嗎?

那就是我們在會話b同乙個事務中,讀取到兩次不同的結果。這就造成了不可重複讀,就是兩次讀取的結果不同。這種現象叫不可重複讀。

現在有個需求,就是老闆說在同乙個事務中查詢結果必須保持一致,如果你是資料庫,你會怎麼做?資料庫是這麼做的。

在會話b中我們當前事務隔離級別為repeatable read。具體操作如下:

set session transaction isolation level repeatable read; start transaction;

接著在會話b中查詢資料:

我們在a使用者所在會話中為表account新增一條資料:

insert into account(id,account) value(3,1000); commit;

然後我們查詢看資料插入是否成功:

回到b使用者所在的會話,我們查詢結果:

使用者b在他所在的會話中想插入一條新資料id=3,value=1000。來我們操作下:

readpeatablereadb3

什麼?竟然插不進去,說我資料重複?

使用者b當然不服啊,因為查詢到資料只有兩條啊,為什麼插入id=3說我資料重複了呢?

我再看一遍,莫非我眼花了?

試想一下,在實際中使用者a和使用者b肯定是相互隔離的,彼此不知道操作什麼。使用者b碰到這種現象,肯定會炸毛的啊,明明不存在的資料,插入卻說主鍵id=3資料重複了。

管他呢,老闆的要求滿足了。要乙個事務中讀取的資料一致(可重複讀)。我只能這麼做啊,打腫臉裝胖子。資料已經發生改變,但是我還是要保持一致。但是,出現了使用者b面對的問題,這種現象叫幻讀(記得當時就在這個地方糾結好久,到底什麼是幻讀啊)。

同樣,我們將使用者b所在的會話的事務隔離級別設定為serializable並開啟事務。

set session transaction isolation level serializable; start transaction;

在使用者b所在的會話中我們執行下面操作:

select * from account;

結果如下:

serializablea

那我們這個時候在使用者a所在的會話中寫資料呢?

readcommitteda1

readcommitteda2

如果在等待期間我們使用者b所在的會話事務提交,那麼使用者a所在的事務的寫操作將提示操作成功。

五分鐘搞清楚MySQL事務隔離級別

好久沒碰資料庫了,只是想起自己當時在搞資料庫的時候在事務隔離級別這塊老是卡,似懂非懂的。現在想把這塊整理出來,盡量用最簡潔的語言描述出來,供新人參考。首先建立乙個表account。建立表的過程略過 由於innodb儲存引擎支援事務,所以將表的儲存引擎設定為innodb 表的結構如下 然後往表中插入兩...

2分鐘搞清楚UML

現在我們帶著4個簡單的問題一起來了解uml 1.什麼是uml?答 統一建模語言 unified modeling language,簡稱uml 是乙個通用的視覺化建模語言,用於對軟體進行描述 視覺化處理 構造和建立軟體系統製品的文件。它記錄了對必須構造的系統的決定和理解,可用於對系統的理解 設計 瀏...

三分鐘搞清楚MES與ERP之間的關係

製造執行系統 manufacturing execution system,簡稱mes 是一套面向製造企業車間執行層的生產資訊化管理系統。mes可以為企業提供包括製造資料管理 計畫排程管理 生產排程管理 庫存管理 質量管理 人力資源管理 工作中心 裝置管理 工具工裝管理 採購管理 成本管理 專案看板...