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


數據庫的四大特性:原子性,一致性,隔離性和持久性。其中:
原子性:指事務包含的所有操作要么全部成功,要么全部失敗回滾;
一致性:指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。
我當時看見這兩個特性就感覺很奇怪,難道原子性和一致性不是一樣的嗎?提交事務,原子性保證要么成功,要么失敗,這樣不就是很好的保證數據庫的一致性了嗎。當時我看見大多數人舉的一致性例子就是轉賬問題:假設用戶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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM