亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

說到數(shù)據(jù)庫,以前我老師有一句很經(jīng)典的話。你可以不會寫SQL,但是一定不能不知道ACID

 

在工業(yè)領(lǐng)域,SQL可以說是應(yīng)用最廣泛的技術(shù)。從后端到算法,從數(shù)據(jù)到DBA,再到產(chǎn)品,甚至連一些運營也會基本的SQL。所以如果你現(xiàn)在還不太會的話,我建議你用一個下午的時間找個網(wǎng)站好好學一下。

 

原本我是想直接寫些Hbase相關(guān)的內(nèi)容,但是我發(fā)現(xiàn)要想講清楚Hbase,必須要講noSQL數(shù)據(jù)庫。如果將noSQL,則又離不開最傳統(tǒng)的關(guān)系型數(shù)據(jù)庫。所以我們一步一步來,先從基礎(chǔ)的關(guān)系型數(shù)據(jù)庫講起。或許我這么說并不準確,因為數(shù)據(jù)庫并不基礎(chǔ),相反它十分復雜。從索引到各種優(yōu)化和設(shè)計原理,再到內(nèi)部的各種算法和數(shù)據(jù)結(jié)構(gòu),涉及到的內(nèi)容非常多。我們先把浩如煙海的知識放一放,先從最核心的數(shù)據(jù)庫四大原則開始說起。

 

數(shù)據(jù)庫事務(wù)ACID四大原則,A代表Atomicity,即原子性。C表示Consistency,即一致性。I表示Isolation,即隔離性。D表示Durability,即持久性

 

這四個原則了解過數(shù)據(jù)庫的應(yīng)該都如雷貫耳。可是真正面試的時候被問起來,能一個不落說得上來,并且講得清楚原委的就不多了。我覺得主要是因為我們的翻譯過于文雅,不像英文那么直觀,所以很難顧名思義。另一個原因是我們在學習的時候理解不夠深入,只知道原因,不知道原因的究竟。所謂知其然,不知其所以然。

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

原子性

 

讓我們先從其中最簡單的原子性開始。

 

原子性理解起來最簡單,也最常用。我就在面試當中遇見過不止一次,還有一次讓我用JAVA寫一個轉(zhuǎn)賬的功能,其實就是想看看我知不知道原子性。

 

原子兩個字看起來一頭霧水,其實這里不是指物理學上的基本粒子,而是指的不可分割的意思。也就是說在一個事務(wù)當中的所有操作應(yīng)該被視為一個不可分割的整體,要么全成功,要么全部失敗。這點用轉(zhuǎn)賬這個問題舉例最合適。A將銀行卡里的錢轉(zhuǎn)100給B,很明顯,數(shù)據(jù)庫需要做兩件事情,一件事A賬戶扣款100,另一件是B賬戶收入100。但問題來了,計算機系統(tǒng)并不是100%可靠的,可能會存在極小的可能失敗。如果A扣款之后,發(fā)生網(wǎng)絡(luò)延遲或者系統(tǒng)down機,導致B賬戶的錢沒有增加,那怎么辦?A不是白白扣了錢?

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

A白白扣了錢是小事,一個金融系統(tǒng)如此不穩(wěn)定,顯然是不能接受的。所以,在數(shù)據(jù)庫的事務(wù)當中,應(yīng)該保證原子性。扣錢和收錢雖然是兩個操作,但是應(yīng)該被視為一個。要么一起成功,要么一起失敗。失敗了還可以重試,如果成功了一半,那都不知道該怎么修復了。

 

事務(wù)的一種實現(xiàn)方法是在執(zhí)行的時候先不將最終的結(jié)果更新到數(shù)據(jù)庫,而是先寫在事務(wù)日志上。等整個事務(wù)執(zhí)行成功之后,再將事務(wù)日志上的內(nèi)容同步到數(shù)據(jù)庫當中。如果失敗了,則將事務(wù)日志刪除,完成回滾。

 

持久性

 

第二個要介紹的是持久性。

 

持久性指的是數(shù)據(jù)的持久性,指的是事務(wù)完成了之后,這個事務(wù)對數(shù)據(jù)庫所作出的修改就被持久地保存進了數(shù)據(jù)庫當中,不會再被回滾操作影響。即使出現(xiàn)了各種事故,比如機房斷電、網(wǎng)絡(luò)故障等等意外情況,數(shù)據(jù)庫當中的數(shù)據(jù)也不能丟失。

 

但是前文當中說了,計算機系統(tǒng)很難做到100%可靠。如果萬一的情況發(fā)生了,數(shù)據(jù)庫當中的數(shù)據(jù)丟了,那么應(yīng)該怎么辦呢?

 

沒關(guān)系,之前在介紹原子性的時候介紹過了。所有的事務(wù)操作在執(zhí)行之前,都會先把數(shù)據(jù)記錄到事務(wù)日志當中,再同步到數(shù)據(jù)庫。即使是數(shù)據(jù)庫里的數(shù)據(jù)丟失了,那么只要根據(jù)事務(wù)日志重新執(zhí)行一遍對應(yīng)的操作,就可以恢復數(shù)據(jù)庫當中的數(shù)據(jù),維持數(shù)據(jù)庫的持久性。實際上,現(xiàn)在的數(shù)據(jù)庫默認會將所有的操作都當做事務(wù)來執(zhí)行,因此基本上不用擔心數(shù)據(jù)丟失的情況。

 

隔離性

 

然后,介紹的是隔離性。

 

在我們理解了原子性之后,隔離性就很好理解了。當我們同時有多個事務(wù)一起執(zhí)行的時候,如果隔離性做得不好,很有可能導致很多問題。

 

以下四種問題最常見:

 

1. 臟讀

 

臟讀是指一個事務(wù)讀到了另一個事務(wù)執(zhí)行的中間結(jié)果。還用我們剛才的轉(zhuǎn)賬的例子舉例:

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

當我們轉(zhuǎn)賬的事務(wù)沒有執(zhí)行完,另一個事務(wù)就讀取了它的中間結(jié)果,很有可能就造成臟讀。因為萬一之前的事務(wù)回滾,那么新讀取到的結(jié)果就是錯的,和A賬號回滾之后的余額不一致。如果這個數(shù)據(jù)應(yīng)用在其他的系統(tǒng)當中,就會引起大規(guī)模的數(shù)據(jù)問題。

 

2. 不可重復讀

 

不可重復讀的意思是說,如果在一個事務(wù)當中,我們讀取了某個數(shù)據(jù)兩次。剛好在這中間,有另一個事務(wù)修改了這條數(shù)據(jù),那么同樣會引起數(shù)據(jù)錯誤,因為這兩次讀取到的結(jié)果不一致。

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

比如我們對A賬戶的一個事務(wù)還沒有結(jié)束,這時候它的結(jié)果就被其他事務(wù)修改了。那么程序就會發(fā)生錯亂,因為讀到了它沒有預(yù)料到的修改。

 

解決方法是針對當前修改的數(shù)據(jù)進行隔離,同一時刻只允許一個事務(wù)對該條數(shù)據(jù)進行修改,以保證數(shù)據(jù)的一致性。

 

3. 幻讀

 

幻讀的概念也很簡單,就是一個事務(wù)讀取兩次,讀到的數(shù)據(jù)條數(shù)不一致。這點和不可重復讀非常類似,不過不同的是不可重復讀針對的是確定的某一條數(shù)據(jù),而幻讀指的是對整個數(shù)據(jù)庫或者是整個表而言。

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

要解決也很簡單,因為幻讀是其他事務(wù)修改新增或者修改其他數(shù)據(jù)產(chǎn)生的,所以要排除掉這種情況,只針對我們修改的數(shù)據(jù)進行加鎖和隔離是不夠的。我們需要將整個數(shù)據(jù)庫,或者是分區(qū)進行隔離,同一時刻,只允許一個事務(wù)對一個分片或者是數(shù)據(jù)表進行修改。

 

4. 更新丟失

 

更新丟失的定義很直觀,當我們針對一條數(shù)據(jù)進行修改的時候。同時也有另一個事務(wù)在修改同一條內(nèi)容,會導致后者覆蓋前者的內(nèi)容。比如說賬戶里原本100元,A事務(wù)往賬戶里添加10元,B事務(wù)往賬戶里扣除20元。A修改成110的同時,被B事務(wù)的80所覆蓋,導致A的操作就像是沒有執(zhí)行過一樣,引起更新丟失。這個問題在并發(fā)場景當中也最為經(jīng)典。

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

解決的辦法同樣是做好隔離操作,在一個寫入完成之前,禁止其他事務(wù)的讀入。事實上更新丟失是并發(fā)場景下最容易出現(xiàn)的錯誤,而且如果設(shè)計不合理,出現(xiàn)了錯誤也會非常難排查。

 

數(shù)據(jù)庫解決隔離性問題的辦法就是設(shè)置不同的隔離級別,不同的隔離級別對應(yīng)不同的隔離策略,可以保證不同級別下的隔離性。不同的隔離級別意味著使用不同級別的鎖,顯然隔離級別越高意味著性能越差。所以這就需要數(shù)據(jù)庫管理員(DBA)對于當前的應(yīng)用場景,以及并發(fā)量和數(shù)據(jù)風險有一個非常清楚的認知。能夠在性能和安全性之間做一個權(quán)衡。這里,我們不多做具體的探究,觀察一下下圖,簡單了解一下即可:

 

一文講透數(shù)據(jù)庫事務(wù)的四原則

 

 

從上到下以此是四種隔離級別,越往下隔離級別越高,能夠解決的隔離性問題也就越多。同樣的,用到的鎖也就越多,系統(tǒng)的性能也就越差。

 

最上面未提交讀是最低的隔離級別,在讀取的時候并不會判斷是否可能會讀取到?jīng)]有提交的數(shù)據(jù)。所以它的隔離性最差,連最簡單的臟讀都無法解決

 

已提交讀則是通過鎖限制了只會讀取已經(jīng)提交的數(shù)據(jù),讀數(shù)據(jù)的時候使用的共享鎖,在讀取完成之后立即釋放。這種隔離級別只能夠解決最常見的臟讀問題,它也是SQL server數(shù)據(jù)庫的默認隔離級別

 

可重復讀的讀取過程和已提交級別一樣,但是在讀取的時候會保持共享鎖,一直到事務(wù)結(jié)束。也就是說只要一個事務(wù)沒有結(jié)束,鎖就不會釋放。其他的事務(wù)無法更新數(shù)據(jù),保證了不會出現(xiàn)不可重復讀的情況。

 

最后是可串行讀,它是在可重復讀的基礎(chǔ)上進一步加強了隔離性。在事務(wù)進行當中,不僅會鎖定受影響的數(shù)據(jù)本身,而且還會鎖定整個范圍。這就阻止了其他事務(wù)影響整體的情況出現(xiàn)。在這個隔離級別下,保證了事務(wù)之間不會有任何踩踏。

 

到這里,數(shù)據(jù)庫事務(wù)四大原則當中的三個就介紹完了,內(nèi)容看起來不少,但其實還沒有結(jié)束,關(guān)于隔離的實現(xiàn)會牽扯到鎖的使用,這塊深挖下去,又會牽扯許多內(nèi)容。不過對于我們算法從業(yè)者而言,能夠了解到這一層,也差不多夠了。

 

四原則當中還剩下一個一致性原則,一致性這個單詞在很多地方都出現(xiàn)過,比如分布式存儲系統(tǒng)、多副本的一致性等等。但是這些概念的意思并不相同,不可以簡單地理解成同一回事。數(shù)據(jù)庫的一致性表示數(shù)據(jù)的狀態(tài)是正確的,在轉(zhuǎn)移的時候,是從一個正確的狀態(tài)轉(zhuǎn)移到了另一個正確的狀態(tài)。正確的狀態(tài)其實就是指不出錯的狀態(tài),也就是和程序員預(yù)期一致的狀態(tài)。之前在介紹隔離性時談到的種種問題,總結(jié)起來都是數(shù)據(jù)和程序員的預(yù)期不一致。也就是說如果和程序員的預(yù)期一致,就可以認為滿足了一致性。

 

雖然一致性是數(shù)據(jù)庫的四原則之一,但數(shù)據(jù)庫系統(tǒng)當中并沒有專門針對一致性的部分。其實在數(shù)據(jù)庫眼中,滿足了其他三原則,那么自然也就達成了一致性。一致性是目的,并不是手段。舉個例子,還是以剛剛轉(zhuǎn)賬的情景距離。A向B轉(zhuǎn)賬100,我們都知道,前提條件是A的賬戶里的金額大于等于100,如果A賬戶里小于100,我們開發(fā)的時候沒有做校驗還強行轉(zhuǎn)賬成功。那么這個結(jié)果顯然是錯誤的,也是和我們預(yù)期不一致的,但是這個問題發(fā)生的原因并不是因為數(shù)據(jù)庫沒有做好一致性,而是開發(fā)人員忽略了限制條件。

 

所以數(shù)據(jù)庫的教材上才會寫著“Ensuring the consistency is the responsibility of user, not DBMS.", "DBMS assumes that consistency holds for each transaction”。

 

“保證一致性是開發(fā)的責任,而不是數(shù)據(jù)庫的,數(shù)據(jù)庫假設(shè)每一個事務(wù)都符合 一致性。”

 

到這里,數(shù)據(jù)庫事務(wù)的四原則就介紹完了,衷心祝大家,日拱一卒,每天都有收獲。

 

喜歡本文的話,請順手給個關(guān)注吧~

分享到:
標簽:數(shù)據(jù)庫
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定