數據庫特性之原子性和一致性

數據庫的四大特性:原子性,一致性,隔離性和持久性。其中:
原子性:指事務包含的所有操作要麼全部成功,要麼全部失敗回滾;
一致性:指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
我當時看見這兩個特性就感覺很奇怪,難道原子性和一致性不是一樣的嗎?提交事務,原子性保證要麼成功,要麼失敗,這樣不就是很好的保證數據庫的一致性了嗎。當時我看見大多數人舉的一致性例子就是轉賬問題:假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。當我我就想難道原子性不就保證了轉賬成功和失敗嗎?
其實,我上述想法是錯的,但是部分錯,因爲,原子性確實代表一致性的部分,但不是全部。下面是我在知乎上看到的答案左輕候,感覺可以很好的解釋原子性和一致性區別。

原子性其實並不能保證一致性的。再多個事務並行進行的情況下,即使保證每一個事務的原子性,任然可能導致數據不一致的結果。

舉例:事務1需要將100元轉入帳號A:先讀取帳號A的值,然後在這個值上加上100。但是,在這兩個操作之間,另一個事務2修改了帳號A的值,爲它增加了100元。那麼最後的結果應該是A增加了200元。但事實上,事務1最終完成後,帳號A只增加了100元,因爲事務2的修改結果被事務1覆蓋掉了。
如上,保證了原子性,但是數據庫的一致性沒有得到保證,上述這種情況就需要數據庫隔離性的保證了。
有需要,請查看原文:
https://www.zhihu.com/question/30272728/answer/132403859

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章