1. 程式人生 > >小白也能看懂的ACID與隔離級別

小白也能看懂的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專欄

訊息中介軟體專欄

併發程式設計專欄

相關推薦

ACID隔離級別

  前言 現如今JAVA開發工程師的數量越來越多,但大多數工程師平時做的工作都是簡單的CRUD,當你一直處於這種舒適的環境中不追求進步的時候,如果哪一天你突然想要改變環境,換個工作,去與面試官當面聊技術的時候,你會發現自己什麼都不會! 可能我們經常會被面試官問到:“你懂事務的ACID嗎?” 你回答:

的零知識證明zk-SNARKs

作為剛剛踏入密碼學的領域的一隻小白,我最近在學習ZCash (ZeroCash) 的原理,也就是zk-SNARKs 。將一點點感悟和理解寫下來,以拋磚引玉。(不得不說看得真讓人頭大啊!) zk-SNARKs zk-SNARKs 是 zero knowledge

的 Laravel 核心概念講解

bin php 依賴註入 keyword set 即將 函數 routes nds 自動依賴註入 什麽是依賴註入,用大白話將通過類型提示的方式向函數傳遞參數。 實例 1 首先,定義一個類: /routes/web.php class Bar {} 假如我們在其他地方要使用到

netty解碼器詳解(!)

什麼是編解碼器?   首先,我們回顧一下netty的元件設計:Netty的主要元件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。 ChannelHandler   ChannelHandler充當了處理入站和出站

爬蟲教程」Python做一個簡單爬蟲,的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。   開發環境 每個人的開發環境各異,下面上是我的開發

Python做一個簡單爬蟲,的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。 開發環境 每個人的開發環境各異,下面上是我的開發環境,對於必須的

「爬蟲教程」Python做一個簡單爬蟲,的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。   開發環境 每個人的開發環境各異,下面上是我的開發

Git的基本使用方法(0基礎)詳細教程(含視訊講解)

git指令介紹,下面有詳解指令可以先跳過直接看下面的詳解 $ mkdir learngit     //建立一個learngit資料夾 $ cd learngit         //進入learngit資料夾 $ pwd                   //用於顯

spring成神之路-基礎(

基礎 1.什麼是IOC 控制反轉(Inversion of Control,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合 度。其中最常見的方式包含: 1)依賴注入(Dependency Injection,簡稱DI) 2)依賴查詢(

全網最簡單!步驟超詳細!的深度學習安裝教程(caffe版)!

想入門深度學習?可是環境就是裝不上?還在對著滿屏的errors抓耳撓腮? 不存在的!!! 小白福利——從零開始手把手教會你安裝一個屬於自己的深度學習環境! 重灌linux os 20多遍、硬著頭皮剛掉了數不盡的error、成功配置了諸多專案苛刻環境的深度學習工作者吐血整理!

【入門篇】區塊鏈糖果空投幣免費領取教程,

一、領取空投幣必備軟體:1.Imtoken以太坊錢包軟體,幣圈支付寶,所有ERC2.0代幣都可以用這個來存。如果不會用點選檢視我們的:imtoken錢包新使用者使用教程2.Telegram電報(幣用)幣圈常用交流工具,加密版國外微信;這也是我們空投幣必備的一個工具;如果不會下

的外掛化DroidPlugin原理(二)-- 反射機制和Hook入門

  前言:在上一篇博文《小白也能看懂的外掛化DroidPlugin原理(一)-- 動態代理》中詳細介紹了 DroidPlugin 原理中涉及到的動態代理模式,看完上篇博文後你就會發現原來動態代理真的非常簡單,只不過就是實現一個 InvocationHandler 介面重寫一

分頁技術,(從後臺傳json到前臺解析顯示)

這是一篇我在初學習過程中,遇到的動態資料分頁顯示的問題,前臺採用Ajax傳給後臺,後臺在訪問資料庫取出分頁資料再轉換為json格式傳遞給前臺,前臺再解析顯示到表格中。在此寫出我在做的過程中遇到的問題,可以讓其他人少走彎路。 前臺方面會用到分頁的外掛,這是傳送地址,http:

漫畫 | 的量子物理漫畫終於來了!

選自 Medium & analyticsvidhya 費米和玻色是兩位著名的物理學家,

RSA 非對稱加密原理(哦~)

RSA 加密原理 步驟 說明 描述 備註 1 找出質數 P 、Q - 2 計算公共模數 N = P * Q - 3 尤拉函式 φ(N) = (P-1)(Q-1) - 4

白話解析分布式系統,

都是 pri 爭論 先後 -o 以及 結果 mysq 自己 西方詩歌有雲,無人是孤島,你我心相系。今天,這句話同樣適用於計算機。我們身邊的服務器,個人電腦以及數據存儲一直都在彼此通信。其實,我們每天使用的(和在開發的)應用和服務也都是構成完整系統的計算元素,彼此進行著交互,

【深度學習】:的卷積神經網路

小編在市面看了很多介紹計算機視覺的知識,感覺都非常深奧,難以理解和入門。因此總結出了一套容易理解的教程,希望能夠和大家分享。 一.人工神經網路 人工神經網路是一種模擬人腦構建出來的神經網路,每一個神經元都具有一定的權重和閾值。僅有單個神經元的圖例如下所示:     從中可以看到每一個神

的Redis教學基礎篇——redis基礎資料結構

各位看官大大們,週末好! 作為一個Java後端開發,要想獲得比較可觀的工資,Redis基本上是必會的(不要問我為什麼知道,問就是被問過無數次)。那麼Redis是什麼,它到底擁有什麼神祕的力量,能獲得眾多公司的青睞?接下來就由小編我帶大家來揭祕Redis的五種基本資料結構。 Redis是C語音編寫的基於記憶體

的Redis教學基礎篇——朋友面試被Skiplist跳躍表攔住了

各位看官大大們,雙節快樂 !!! 這是本系列部落格的第二篇,主要講的是Redis基礎資料結構中ZSet(有序集合)底層實現之一的Skiplist跳躍表。  不知道那些是Redis基礎資料結構的看官們,可以翻閱我的上一篇文章:  小白也能看懂的REDIS教學基礎篇——REDIS基礎資料結構

的ArrayList的擴容機制

來,話不多說進入正題!我們下面用最簡單的程式碼建立ArrayList並新增11個元素,並 一 一 講解底層原始碼;在說之前,給大家先普及一些小知識:   》ArrayList底層是用陣列來實現的   》陣列一旦建立後,大小就是固定的,如果超出了陣列大小後,就會建立一個新的陣列   》接下來所謂陣列的擴容實質上