關於mysql的隔離級別與事務

這裏寫下本人接觸mysql隔離級別的經歷和踩過的坑。

 

當初爲了處理一個抽獎系統功能,那避免不了要考慮多線程併發下數據要保證完整性。作者一開始就想到貌似有個隔離級別是 可重複讀,那是不是直接使用這個隔離級別就ok了,實際上是我想多了,後來是通過悲觀鎖去處理的(這個是題外話,之後會寫個處理方案的文章),這裏言歸正傳,介紹並實踐下mysql的隔離級別(軟件工程畢竟歸屬工科,需將理論應用於實際才能真正融會貫通)。

 

當然要明白隔離級別就必須對事務有點理解,這裏順帶提一下

事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。

事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。

事務的 ACID

事務具有四個特徵:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱爲 ACID 特性。

1 、原子性。事務是數據庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做

2 、一致性。事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。

3 、隔離性。一個事務的執行不能被其它事務干擾。即一個事務內部的操作及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。

4 、持續性。也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

 

 

下面是mysql4種隔離級別的簡介

讀未提交 Read Uncommitted(在本次事務中可以讀到其他事務中沒有提交的數據 - 髒數據)
讀已提交 Read Committed (只能讀到其他事務提交過的數據。如果在當前事務中,其他事務有提交,則兩次讀取結果不同)
可重複讀 Repeatable Read (默認,保證了同一事務中每次讀取結果都相同,而不管其他事物是否已經提交。會出現幻讀)
序列化 Serializable (隔離級別中最嚴格的,開啓一個 serializable 事務,那麼其他事務對數據表的寫操作都會被掛起)

 

這個就不講例子,這些都已經有大把人寫過,想看可以看看別人舉的例子,只有懂了這些隔離級別的影響才能用好他

這裏mysql是默認 可重複讀,那我就重這裏開始吧。

 

可重複讀 Repeatable Read

首先我打開一個操作界面(這裏用navicat)直接去服務器的容器裏也是一樣的,這裏我手動開啓一個事務並進行了兩個查詢select id,nickname from member where id=1;

第一次得到得nickname是ppxx1

                                                                                    圖1

接着我們在打開另外一個窗口,直接進行一個update操

update member set nickname='ppx' where id=1;

明顯成功了名字也變成了

j'j

接着回到第一個窗口,重複使用圖1的查詢語句,發現查詢的結果是一樣,這樣就可以理解可重複讀的概念了把,當然這樣的前提是你的查詢操作是在其他事務對這個查詢相關數據進行更改並提交事務之前。通過上面的操作就不難看出出現幻讀的原因了把,讀了之後再次讀的數據是一樣的,那別人在插入或刪除一條數據並提交數據,你不就懵逼嗎?

 

接下我們先更改下mysql的隔離級別

讀已提交 Read Committed

這個時候在重複一下上面可重複讀的操作

這個是窗口1,我們開始事務並查詢第一次看到結果如下圖。。這個時候去打開另外一個窗口在開啓一個事務update一下剛剛那些數據但不提交如下下圖,接着如下圖在進行一次查詢結果是沒變的

接着提交上圖中的事務,並執行下,上上圖中的查詢,這個時候內容變化了

 

所以你明顯就可以知道了,讀已提交 的含義了把。

 

讀未提交 Read Uncommitted 和 序列化 Serializable 我感覺就不用展示了把,你只要明白了上面提到的2種隔離級別的表現,這兩個應該不難理解了把,有興趣可以參考上面的操作去切換隔離級別並嘗試一下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章