原子性和一致性的區別是什麽?
阿新 • • 發佈:2019-02-21
邏輯 知乎 依賴 原子 持久 狀態 .com 必須 strong
註:
重度參考了:https://www.zhihu.com/question/30272728/answer/72476703(講的非常好,邏輯清晰)
輕度參考了:https://www.cnblogs.com/fjdingsd/p/5273008.html(概念也比較清晰,只不過沒有對比著這兩個特性講)
概念
原子性:一個事務內的操作,要麽同時成功,要麽同時失敗
一致性:一個事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態
對於一致性,知乎鏈接中內容如下:
從這段話的理解來看,所謂一致性,即,從實際的業務邏輯上來說,最終結果是對的、是跟程序員的所期望的結果完全符合的
重點
一致性是基礎,也是最終目的,其他三個特性(原子性、隔離性和持久性)都是為了保證一致性的
在比較簡單的場景(沒有高並發)下,可能會發生一些數據庫崩潰等情況,這個時候,依賴於對日誌的 REDO/UNDO 操作就可以保證一致性
而在比較復雜的場景(有高並發)下,可能會有很多事務並行的執行,這個時候,就很可能導致最終的結果無法保證一致性,比如(內容來自知乎鏈接):
即,這個時候,原子性不能保證一致性。因為從單個事務的角度看,不管是事務 1 還是事務 2,它們都保證的原子性(單個事務內的所有操作全部成功了),但最終,它們並沒有保證數據庫的一致性(因為從邏輯上說,賬戶 A 應該增加了 200 元,而不是 100 元)
所以,為了保證並發情況下的一致性,又引入了隔離性的概念
隔離性:即事務之間感知不到彼此的存在,就好像只存在本身一個事務一樣
而對於怎樣實現隔離性,又涉及到了樂觀鎖和悲觀鎖的概念(這兩個概念還不大懂)
小小引申:
不考慮隔離性的時候,可能導致臟讀、幻讀和不可重復讀的問題(這些問題,其實就是導致無法保證一致性的幾種情況)
而隔離級別的概念,就是為了解決上述三個問題
原子性和一致性的區別是什麽?