简单理解mysql事务_如何理解数据库事务中的一致性的概念?
比較支持@Kai Peng 的答案,只是缺少例子說明. 而其他一些人的答案甚至有明顯的錯(cuò)誤.最近正好也在研究這方面的東西,不算是回答,就是跟大家討論討論.
首先,我們需要搞清楚為什么會(huì)出現(xiàn)事務(wù).[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).
這句話的大體含義就是,事務(wù)的產(chǎn)生,其實(shí)是為了當(dāng)應(yīng)用程序訪問數(shù)據(jù)庫的時(shí)候,事務(wù)能夠簡(jiǎn)化我們的編程模型,不需要我們?nèi)タ紤]各種各樣的潛在錯(cuò)誤和并發(fā)問題.可以想一下當(dāng)我們使用事務(wù)時(shí),要么提交,要么回滾,我們不會(huì)去考慮網(wǎng)絡(luò)異常了,服務(wù)器宕機(jī)了,同時(shí)更改一個(gè)數(shù)據(jù)怎么辦對(duì)吧?因此事務(wù)本質(zhì)上是為了應(yīng)用層服務(wù)的.而不是伴隨著數(shù)據(jù)庫系統(tǒng)天生就有的.
其次,說道一致性,很遺憾,這個(gè)詞在不同的環(huán)境下有著不同的含義,被極大的濫用了,導(dǎo)致很難理解:1. 多副本的一致性
2. 一致性hash.
3. CAP理論的一致性
4. ACID里的一致性
而這幾個(gè)一致性的含義都
不是一回事!
不是一回事!
不是一回事!
所有提到最終一致性,一致讀的回答,都是不對(duì)的,那是CAP里面C的含義,具體可以搜索查詢Linearizability這個(gè)詞的含義,這個(gè)并不是今天的重點(diǎn).
然后回到問題!!!
樓主提到了ACID,那么我們就可以簡(jiǎn)化問題單機(jī)場(chǎng)景下事務(wù)里一致性的含義,為什么不討論分布式呢?因?yàn)榧热灰粋€(gè)分布式數(shù)據(jù)庫提供了ACID事務(wù)保證,那么你把它看做單機(jī)又何妨呢?它是如何做到如同單機(jī)一般的,我們根本不需要關(guān)心啊.所以只考慮單機(jī)能夠簡(jiǎn)化樓主的思維.
ACID里的AID都是數(shù)據(jù)庫的特征,也就是依賴數(shù)據(jù)庫的具體實(shí)現(xiàn).而唯獨(dú)這個(gè)C,實(shí)際上它依賴于應(yīng)用層,也就是依賴于開發(fā)者.這里的一致性是指系統(tǒng)從一個(gè)正確的狀態(tài),遷移到另一個(gè)正確的狀態(tài).什么叫正確的狀態(tài)呢?就是當(dāng)前的狀態(tài)滿足預(yù)定的約束就叫做正確的狀態(tài).而事務(wù)具備ACID里C的特性是說通過事務(wù)的AID來保證我們的一致性.做個(gè)比喻事務(wù)就好比一個(gè)保鏢,我們提到事務(wù)就會(huì)說ACID,而我們提到保鏢會(huì)說強(qiáng)壯,保護(hù)安全,好功夫,踏實(shí).這里強(qiáng)壯,好功夫和踏實(shí)都是保鏢自己的特征,而安全是屬于你的,而你通過保鏢的特征來保護(hù)你的安全.
但是這里必須注意,我們能夠通過AID保證我們的一致性,但事務(wù)本身沒辦法確保.用上面保鏢的例子來說,你正常被保護(hù)一定是安全的,但是你故意騙保鏢離開你身邊,然后你自己溜出去玩.同樣,如果你在事務(wù)里故意寫出違反約束的代碼,比如銀行系統(tǒng)定時(shí)每天給自己的賬戶打入100w,這個(gè)事務(wù)是沒辦法的.
這里我們舉個(gè)大家都在說的財(cái)務(wù)系統(tǒng)的例子.A要向B支付100元,而A的賬戶中只有90元,并且我們給定賬戶余額這一列的約束是,不能小于0.那么很明顯這條事務(wù)執(zhí)行會(huì)失敗,因?yàn)?0-100=-10,小于我們給定的約束了.
這個(gè)例子里,支付之前我們數(shù)據(jù)庫里的數(shù)據(jù)都是符合約束的,但是如果事務(wù)執(zhí)行成功了,我們的數(shù)據(jù)庫數(shù)據(jù)就破壞約束了,因此事務(wù)不能成功,這里我們說事務(wù)提供了一致性的保證.然后我們?cè)倏磦€(gè)例子A要向B支付100元,而A的賬戶中只有90元,我們的賬戶余額列沒有任何約束.但是我們業(yè)務(wù)上不允許賬戶余額小于0.因此支付完成后我們會(huì)檢查A的賬戶余額,發(fā)現(xiàn)余額小于0了,于是我們進(jìn)行了事務(wù)的回滾.
這個(gè)例子里,如果事務(wù)執(zhí)行成功,雖然沒有破壞數(shù)據(jù)庫的約束,但是破壞了我們應(yīng)用層的約束.而事務(wù)的回滾保證了我們的約束,因此也可以說事務(wù)提供了一致性保證(ps:事實(shí)上,是我們應(yīng)用層利用事務(wù)回滾保證了我們的約束不被破壞).最后我們?cè)倏磦€(gè)例子A要向B支付100元,而A的賬戶中只有90元,我們的賬戶余額列沒有任何約束.然后支付成功了.
這里,如果按照很多人的理解,事務(wù)不是保證一致性么?直觀上賬戶余額為什么能為負(fù)呢.但這里事務(wù)執(zhí)行前和執(zhí)行后,我們的系統(tǒng)沒有任何的約束被破壞.一直都是保持正確的狀態(tài).
所以,綜上.你可以理解一致性就是:應(yīng)用系統(tǒng)從一個(gè)正確的狀態(tài)到另一個(gè)正確的狀態(tài).而ACID就是說事務(wù)能夠通過AID來保證這個(gè)C的過程.C是目的,AID都是手段.
回答里肯定有諸多有誤的地方,希望大神們能夠指正~
以上.
總結(jié)
以上是生活随笔為你收集整理的简单理解mysql事务_如何理解数据库事务中的一致性的概念?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑性能提升秘籍:双通道内存插满,让速度
- 下一篇: mysql mybatis配置_myba