對事務一致性的理解

2021-08-18 06:35:04 字數 1040 閱讀 6264

要想真正弄清楚這個問題,那是必須要把資料庫理論中的事務機制從頭開始看起,牽扯的內容比較多。

當然,如果只是想粗略的了解下,我就來舉個例子吧——當然不可能太嚴謹。

假設我們10個人,每人有乙個賬號,裡面有錢,可以轉來轉去,這組成了乙個小型的資料系統,那麼什麼叫資料一致性?這是由你自己來定義的,比較通用的就是:這10個人的賬號金額總數不變——滿足這一條件,就叫資料一致,不滿足,就叫資料不一致,或者在分布式的環境下,有乙個資料在幾個地方都儲存了,那麼任何時候,這幾個地方的資料都必須相同,這也叫一致性。

現在我們就這個簡單的一致性規則:10個人的賬號金額總數不變。假設初始的時候每個人賬號裡有一萬,a賬號往b賬號裡轉5000,這時候資料庫要執行兩行**:

a:減去5000

b:加上5000

在執行完第一行**的時候,這時候資料是不滿足一致性條件的!必須要執行完第二行**,資料才恢復到一致性的狀態!換而言之,資料庫中的資料是經常處於不一致的狀態,這是不可避免的,因此我們提出了事務的概念,用於檢測資料庫中的資料是否處於一致性狀態——如果資料庫中有沒有執行完的事務,那就是不一致的,否則,就是一致的。

上面的例子只是最簡單的情況,實際的運用中要複雜得多,比如前面提到的分布式系統:某個資料存在了三個伺服器上,現在要更新,就必須保證三個伺服器上全都更新好,如果有乙個沒有成功,那麼其他兩個也應該維持不變,這又涉及到網路通訊等問題,非常的折騰。

——————————————————————————————————————

還是用上面的這個例子:

為了保證一致性(即10個人 的賬號金額總數不變),那在我寫**的時候,如果寫了**:

a=a-5000;

那就必須要寫上

b=b+5000,或者是c=c+5000,這樣的**才能保證了資料庫的一致性狀態。

那什麼是原子性?

就是將上面的兩行**合成為乙個事務,要麼全做,要麼全不做。

比如我寫了兩行**:

a=a+2000;

b=b+3000;

如果這兩行**看成是乙個事務,並且在某一時刻全執行完了,那麼這個事務的原子性滿足了,但卻沒有滿足資料庫的一致性。

事務的一致性

首先,我們需要搞清楚為什麼會出現事務.這句話的大體含義就是,事務的產生,其實是為了當應用程式訪問資料庫的時候,事務能夠簡化我們的程式設計模型,不需要我們去考慮各種各樣的潛在錯誤和併發問題.可以想一下當我們使用事務時,要麼提交,要麼回滾,我們不會去考慮網路異常了,伺服器宕機了,同時更改乙個資料怎麼辦對...

強一致性 弱一致性 最終一致性

這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...

事務一致性的測試

框架 spring 資料庫 innodb 位址 isolation isolation.serializable 事務1 序列化 事務2 不可重複讀 預設隔離級別 執行順序 結果1開啟 2開啟 2結束 1結束 事務1正常,事務2發生死鎖異常 1開啟 2開啟 1結束 2結束 事務2的操作覆蓋了事務1的...