简单理解mysql事务_如何理解数据库事务中的一致性的概念?
比較支持@Kai Peng 的答案,只是缺少例子說明. 而其他一些人的答案甚至有明顯的錯誤.最近正好也在研究這方面的東西,不算是回答,就是跟大家討論討論.
首先,我們需要搞清楚為什么會出現事務.[1]Transactions are not a law of nature; they were created with a purpose, namely to simplify the programming model for applications accessing a database. By using transactions, the application is free to ignore certain potential error scenarios and concurrency issues, because the database takes care of them instead (we call these safety guarantees).
這句話的大體含義就是,事務的產生,其實是為了當應用程序訪問數據庫的時候,事務能夠簡化我們的編程模型,不需要我們去考慮各種各樣的潛在錯誤和并發問題.可以想一下當我們使用事務時,要么提交,要么回滾,我們不會去考慮網絡異常了,服務器宕機了,同時更改一個數據怎么辦對吧?因此事務本質上是為了應用層服務的.而不是伴隨著數據庫系統天生就有的.
其次,說道一致性,很遺憾,這個詞在不同的環境下有著不同的含義,被極大的濫用了,導致很難理解: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都是手段.
回答里肯定有諸多有誤的地方,希望大神們能夠指正~
以上.
總結
以上是生活随笔為你收集整理的简单理解mysql事务_如何理解数据库事务中的一致性的概念?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 电脑性能提升秘籍:双通道内存插满,让速度
- 下一篇: 内存需求揭秘:现如今的网游到底需要多大内
