還原面試現場-ACID與隔離級別

 

前言

現如今JAVA開發工程師的數量越來越多,但大多數工程師平時做的工作都是簡單的CRUD,當你一直處於這種舒適的環境中不追求進步的時候,如果哪一天你突然想要改變環境,換個工作,去與面試官當面聊技術的時候,你會發現自己什麼都不會!

可能我們經常會被面試官問到:“你懂事務的ACID嗎?”

你回答:“ACID不就是原子性、一致性、隔離性和持久性嘛,這有什麼好說的。”

當你這麼回答的時候,面試官微微一笑,又問到:“說的不錯,那你能具體解釋一下嗎?”

你支支吾吾半天也沒有說的特別清楚。

面試官有些不耐煩:“好了,我知道了,那你能和我說說事務的隔離級別嗎?”

你突然發現自己說不出來什麼,想了想,還是回去準備準備再面試吧。

小夥伴們可以思考一下,如果是你,可以很好的回答這個問題嗎?如果不確定,就與王子一起深入的研究一下吧,絕對讓你印象深刻。

 

事務的ACID

假設現在面試官讓我們說一說什麼是事務的ACID,我們該怎麼回答呢?

首先ACID指的是原子性、一致性、隔離性和持久性

A就是Atomic,原子性說白了就是一堆sql,要麼一起執行成功,要麼就都不執行,不存在其中一條執行成功的情況。

C就是Consistency,一致性是針對數據來講的,可以理解成sql執行之前和執行之後的數據必須是準確的,不能有誤差。

I就是Isolation,隔離性,就是說兩個事務之間互不干擾。

D就是Durability,持久性,事務執行成功了,當然要保證修改後的數據有效了,所以要把數據保存起來。

面試官聽了我們的講解,覺得說的還不錯,接着就來讓我們再說一下事務的隔離級別。

 

事務的隔離級別

事務的隔離級別同樣有四個,分別是:讀未提交、讀已提交(不可重複讀)、可重複讀、串行化

讀未提交:這個很好理解,就是說某個事務修改了一條數據,還沒有提交的時候,其他事務就能讀取到修改後的數據,術語上也被稱爲髒讀;

讀已提交:字面意思,就是事務修改了數據並提交之後,其他事務才能查詢到修改後的數據。那爲什麼它又叫不可重複讀呢?因爲A事務修改數據提交之後,其他事務是可以直接讀取到的,也就是說事務B剛開始讀取的數據是1,執行過程中數據被事務A修改成了2,這個時候事務B再讀取的時候獲取到的是2而不是1,也就是說重複讀取數據可能出現數據的不一致。

可重複讀:理解了不可重複讀,可重複讀就很容易理解了,就是說一個事務重複讀取同一個數據可以保證讀取到的值與最開始讀取到的值是一致的。

串行化:串行化針對的是數據的插入,比如說一個事務批量修改某個字段的值爲2,但同時另一個事務在執行插入操作,插入的這個字段的值是1,這就導致了最終結果有一行數據這個字段的值是錯誤的,這種情況術語上被稱爲幻讀。而解決幻讀的方法就是串行化了,串行化後事務只能串行運行,不能並行操作。

面試官聽了我們這樣的解釋之後,毫不掩飾的對我們表示了認可,但我們發現他還在思考怎麼提問題。

於是我們先下手爲強,準備拋出一個大招,向面試官提出“其實我對可重複讀在Mysql中是如何實現的比較感興趣,所以我研究了一下這一部分,也跟您聊聊吧”。

 

MySQL是如何實現可重複讀的

我們知道Mysql數據庫默認的隔離級別就是可重複讀。

MySql的內部其實是通過MVCC機制來實現可重複讀的,MVCC的意思是多版本併發控制。

Mysql的Innodb引擎會在每行數據的最後增加兩個隱藏列,一個是行的創建時間,一個是行的刪除時間,但這兩個列中保存的其實不是時間,而是事務id,事務id是自增且唯一的。

那麼假設當前數據的創建事務id爲1,刪除事務id爲3,如下:

id  name  創建事務id  刪除事務id

1   張三          1         3 

那麼如果正在執行的事務id爲2,來查詢這條數據是可以查得到的,因爲當前執行的事務會查詢事務id<=2的數據快照,所以無論後續事務對這條數據做什麼操作,都不影響事務id爲2的事務對這條數據的查詢。

這就是MVCC機制的實現方式。

面試官聽完你的這段回答之後,眼睛一下子亮了起來,立馬讓你明天來上班吧。

 

總結

今天王子想和大家討論的問題到這裏就結束了,沒有什麼圖片的演示,也沒有什麼代碼的展示。

主要是以模擬面試現場的方式與大家分享了ACID與隔離級別的知識,希望可以讓小夥伴們印象深刻。

如果有什麼問題也歡迎聯繫我,讓我們共同探討。

 

往期文章推薦:

JVM專欄

消息中間件專欄

併發編程專欄

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