前言
現如今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與隔離級別的知識,希望可以讓小夥伴們印象深刻。
如果有什麼問題也歡迎聯絡我,讓我們共同探討。
往期文章推薦: