原子性和一致性的區別是什麼?

 
 
注:
重度參考了: https://www.zhihu.com/question/30272728/answer/72476703(講的很是好,邏輯清晰)
輕度參考了: http://www.javashuo.com/article/p-nhxvhjdf-s.html(概念也比較清晰,只不過沒有對比着這兩個特性講)
 
概念
原子性:一個事務內的操做,要麼同時成功,要麼同時失敗
一致性:一個事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態
 
對於一致性,知乎連接中內容以下:
從這段話的理解來看,所謂一致性,即,從實際的業務邏輯上來講,最終結果是對的、是跟程序員的所指望的結果徹底符合的
 
重點
一致性是基礎,也是最終目的,其餘三個特性(原子性、隔離性和持久性)都是爲了保證一致性的
在比較簡單的場景(沒有高併發)下,可能會發生一些數據庫崩潰等狀況,這個時候,依賴於對日誌的 REDO/UNDO 操做就能夠保證一致性
而在比較複雜的場景(有高併發)下,可能會有不少事務並行的執行,這個時候,就極可能致使最終的結果沒法保證一致性,好比(內容來自知乎連接):
即,這個時候,原子性不能保證一致性。由於從單個事務的角度看,無論是事務 1 仍是事務 2,它們都保證的原子性(單個事務內的全部操做所有成功了),但最終,它們並無保證數據庫的一致性(由於從邏輯上說,帳戶 A 應該增長了 200 元,而不是 100 元)
因此,爲了保證併發狀況下的一致性,又引入了隔離性的概念
 
隔離性:即事務之間感知不到彼此的存在,就好像只存在自己一個事務同樣
而對於怎樣實現隔離性,又涉及到了樂觀鎖和悲觀鎖的概念(這兩個概念還不大懂)
 
小小引伸:
不考慮隔離性的時候,可能致使髒讀、幻讀和不可重複讀的問題(這些問題,其實就是致使沒法保證一致性的幾種狀況)
而隔離級別的概念,就是爲了解決上述三個問題
相關文章
相關標籤/搜索