一致性是指數據處於一種語義上的有意義且正確的狀態。一致性是對數據可見性的約束,保證在一個事務中的多次操作的數據中間狀態對其他事務不可見的。因為這些中間狀態,是一個過渡狀態,與事務的開始狀態和事務的結束狀態是不一致的。
舉個粒子,張三給李四轉賬100元。事務要做的是從張三賬戶上減掉100元,李四賬戶上加上100元。一致性的含義是其他事務要么看到張三還沒有給李四轉賬的狀態,要么張三已經成功轉賬給李四的狀態,而對於張三少了100元,李四還沒加上100元這個中間狀態是不可見的。
那么反駁的聲音來了:
要么轉賬操作全部成功,要么全部失敗,這是原子性。從例子上看全部成功,那么一致性就是原子性的一部分咯,為什么還要單獨說一致性和原子性?
你說的不對。在未提交讀的隔離級別下是事務內部操作是可見的,明顯違背了一致性,怎么解釋?
好吧,需要注意的是:
原子性和一致性的的側重點不同:原子性關注狀態,要么全部成功,要么全部失敗,不存在部分成功的狀態。而一致性關注數據的可見性,中間狀態的數據對外部不可見,只有最初狀態和最終狀態的數據對外可見
隔離性是多個事物的時候, 相互不能干擾,一致性是要保證操作前和操作后數據或者數據結構的一致性,而我提到的事務的一致性是關注數據的中間狀態,也就是一致性需要監視中間狀態的數據,如果有變化,即刻回滾
(一系列操作后,所有的操作和更新全部提交成功,數據庫只包含全部成功后的數據就是數據的一致性)