ACID:
- Atomicity: the transaction is either completely or not at all. For this, the beginning of the transaction is marked with the BEGIN command, and the end is either COMMIT (commit changes) or ROLLBACK (undo changes).
- Consistency: the transaction begins in a consistent state and, completing, also maintains consistency.
- Isolation: other transactions running at the same time with this one should not affect it.
- Durability: after the data are recorded, they should not be lost even in case of failure.
一致性是指數據處於一種語義上的有意義且正確的狀態。一致性是對數據可見性的約束,保證在一個事務中的多次操作的數據中間狀態對其他事務不可見的。因為這些中間狀態,是一個過渡狀態,與事務的開始狀態和事務的結束狀態是不一致的。
舉個栗子,張三給李四轉賬100元。事務要做的是從張三賬戶上減掉100元,李四賬戶上加上100元。一致性的含義是其他事務要么看到張三還沒有給李四轉賬的狀態,要么張三已經成功轉賬給李四的狀態,而對於張三少了100元,李四還沒加上100元這個中間狀態是不可見的。
那么反駁的聲音來了:
1.要么轉賬操作全部成功,要么全部失敗,這是原子性。從例子上看全部成功,那么一致性就是原子性的一部分咯,為什么還要單獨說一致性和原子性? 2.你說的不對。在未提交讀的隔離級別下是事務內部操作是可見的,這時候會出現臟讀,明顯違背了一致性,怎么解釋?
好吧,你的疑問很有道理,也很充分,這正說明你對事務的ACID特性理解的很到位。不過,需要注意的是:
1.原子性和一致性的的側重點不同:原子性關注狀態,要么全部成功,要么全部失敗,不存在部分成功的狀態。而一致性關注數據的可見性,中間狀態的數據對外部不可見,只有最初狀態和最終狀態的數據對外可見。 2.在未提交讀的隔離級別下,會造成臟讀,這就是因為一個事務讀到了另一個事務操作內部的數據。ACID中是的一致性描述的是一個最理想的事務應該怎樣的,是一個強一致性狀態,如果要做到這點,需要使用排它鎖把事務排成一隊,即Serializable的隔離級別,這樣性能就大大降低了。現實是骨感的,所以使用隔離性的不同隔離級別來破壞一致性,來獲取更好的性能。
部分參考自:https://blog.csdn.net/zhangfeng5909/article/details/80909268