事務的一致性

2021-10-11 20:48:44 字數 1951 閱讀 6558

首先,我們需要搞清楚為什麼會出現事務.

這句話的大體含義就是,事務的產生,其實是為了當應用程式訪問資料庫的時候,事務能夠簡化我們的程式設計模型,不需要我們去考慮各種各樣的潛在錯誤和併發問題.可以想一下當我們使用事務時,要麼提交,要麼回滾,我們不會去考慮網路異常了,伺服器宕機了,同時更改乙個資料怎麼辦對吧?因此事務本質上是為了應用層服務的.而不是伴隨著資料庫系統天生就有的.

其次,說道一致性,很遺憾,這個詞在不同的環境下有著不同的含義,被極大的濫用了,導致很難理解:

1. 多副本的一致性

2. 一致性hash.

3. cap理論的一致性

4. acid裡的一致性

而這幾個一致性的含義都

不是一回事!

不是一回事!

不是一回事!

所有提到最終一致性,一致讀的回答,都是不對的,那是cap裡面c的含義,具體可以搜尋查詢linearizability這個詞的含義,這個並不是今天的重點.

然後回到問題!!!

樓主提到了acid,那麼我們就可以簡化問題單機場景下事務裡一致性的含義,為什麼不討論分布式呢?因為既然乙個分布式資料庫提供了acid事務保證,那麼你把它看做單機又何妨呢?它是如何做到如同單機一般的,我們根本不需要關心啊.所以只考慮單機能夠簡化樓主的思維.

acid裡的aid都是資料庫的特徵,也就是依賴資料庫的具體實現.而唯獨這個c,實際上它依賴於應用層,也就是依賴於開發者.這裡的一致性是指系統從乙個正確的狀態,遷移到另乙個正確的狀態.什麼叫正確的狀態呢?就是當前的狀態滿足預定的約束就叫做正確的狀態.而事務具備acid裡c的特性是說通過事務的aid來保證我們的一致性.

做個比喻事務就好比乙個保鏢,我們提到事務就會說acid,而我們提到保鏢會說強壯,保護安全,好功夫,踏實.這裡強壯,好功夫和踏實都是保鏢自己的特徵,而安全是屬於你的,而你通過保鏢的特徵來保護你的安全.
但是這裡必須注意,我們能夠通過aid保證我們的一致性,但事務本身沒辦法確保.用上面保鏢的例子來說,你正常被保護一定是安全的,但是你故意騙保鏢離開你身邊,然後你自己溜出去玩.同樣,如果你在事務裡故意寫出違反約束的**,比如銀行系統定時每天給自己的賬戶打入100w,這個事務是沒辦法的.

這裡我們舉個大家都在說的財務系統的例子.

a要向b支付100元,而a的賬戶中只有90元,並且我們給定賬戶餘額這一列的約束是,不能小於0.那麼很明顯這條事務執行會失敗,因為90-100=-10,小於我們給定的約束了.
這個例子裡,支付之前我們資料庫裡的資料都是符合約束的,但是如果事務執行成功了,我們的資料庫資料就破壞約束了,因此事務不能成功,這裡我們說事務提供了一致性的保證.然後我們再看個例子

a要向b支付100元,而a的賬戶中只有90元,我們的賬戶餘額列沒有任何約束.但是我們業務上不允許賬戶餘額小於0.因此支付完成後我們會檢查a的賬戶餘額,發現餘額小於0了,於是我們進行了事務的回滾.
這個例子裡,如果事務執行成功,雖然沒有破壞資料庫的約束,但是破壞了我們應用層的約束.而事務的回滾保證了我們的約束,因此也可以說事務提供了一致性保證(ps:事實上,是我們應用層利用事務回滾保證了我們的約束不被破壞).最後我們再看個例子

a要向b支付100元,而a的賬戶中只有90元,我們的賬戶餘額列沒有任何約束.然後支付成功了.
這裡,如果按照很多人的理解,事務不是保證一致性麼?直觀上賬戶餘額為什麼能為負呢.但這裡事務執行前和執行後,我們的系統沒有任何的約束被破壞.一直都是保持正確的狀態.

所以,綜上.你可以理解一致性就是:應用系統從乙個正確的狀態到另乙個正確的狀態.而acid就是說事務能夠通過aid來保證這個c的過程.c是目的,aid都是手段.

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

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

事務一致性的測試

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

oracle事務一致性 原子性

事務的動作要麼一起成功,要麼都不成功,這是事務的原子性。原子性包括 語句級原子性 過程級原子性 事務級原子性 ddl與原子性 如果某條語句 如insert update 執行成功與否會自動控制事務。如設定插入前的觸發器。create table t2 cnt int insert into t2 v...