當(dāng)我們接觸數(shù)據(jù)庫系統(tǒng)相關(guān)的知識,或者涉及到電商先匪、支付相關(guān)的系統(tǒng)設(shè)計(jì)捎拯,通常會聽到"事務(wù)"這個詞。
關(guān)于事務(wù)的定義
事務(wù)(Transaction) 是什么呢:
淳樸的理解毯欣,一系列操作馒过,完成一件目標(biāo),事務(wù)就是這一系列操作的序列捆綁在一起的整體酗钞。
為什么需要事務(wù)這個定義呢:
我們看一個轉(zhuǎn)賬的過程:
有一堆轉(zhuǎn)賬請求: 張三給李四轉(zhuǎn)100塊腹忽,王麻子給張二嘎轉(zhuǎn)50塊
對于每筆轉(zhuǎn)賬請求,系統(tǒng)需要依次做如如下操作
1. 確認(rèn)張三賬戶有至少一百塊
2. 給張三的賬戶減少100塊
3. 李四的賬戶增加100塊
4. 這一條轉(zhuǎn)賬請求標(biāo)記上砚作,已處理
如果因?yàn)橄到y(tǒng)異常窘奏,4個操作任何一個沒有寫入成功,那賬本一定會出錯了葫录,
所以蔼夜,這4個操作,被我們定義為了一個事務(wù)
事務(wù)的四大特性
四個特性:原子性压昼,一致性求冷,隔離性,持久性
和其他一些文章不同窍霞,我們這里先明確匠题,一致性是終極目標(biāo),而非手段但金,我們先來看一致性的定義:
(很多同學(xué)韭山,包括我一開始覺得原子性和一致性是一回事,就是沒有明白,一致性是目標(biāo)钱磅,而非手段)
特性一: 一致性
定義:一旦事務(wù)的所有操作結(jié)束梦裂,事務(wù)就被提交。然后數(shù)據(jù)和資源將處于遵循業(yè)務(wù)規(guī)則的一致狀態(tài)盖淡。
大白話就是說:涉及事務(wù)的系統(tǒng)年柠,各種操作提交下,業(yè)務(wù)邏輯要正確
接下來褪迟,為了解決破壞一致性的若干問題冗恨,我們依次引入其他三個特性
問題一:前文提到的4個操作,操作到一半系統(tǒng)掛了味赃,丟失了若干操作步驟掀抹,那么數(shù)據(jù)庫的數(shù)據(jù)就出錯了,一致性被破壞了
怎么解決這個問題呢心俗,引入原子性的概念
特性二: 原子性
定義:事務(wù)是一個包含一系列操作的原子操作傲武。事務(wù)的原子性確保這些操作全部完成或者全部失敗。
然而城榛,情況沒那么簡單:
問題二: 并發(fā)怎么辦
假設(shè)同時兩個轉(zhuǎn)賬請求過來了:A. 張三給李四轉(zhuǎn)100塊 B. 張三給王五轉(zhuǎn)100塊
兩個線程同時處理兩個請求
大部分軟件工程師谱轨,大概都能看出有問題,線程會沖突吠谢,就會帶來如下的若干問題:
A. 覆蓋性問題
第一類更新丟失
A事務(wù)撤銷時土童,把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。
第二類更新丟失
B事務(wù)覆蓋A事務(wù)已經(jīng)提交的數(shù)據(jù)工坊,造成A事務(wù)所做操作丟失献汗。
B. 一致性問題
臟讀:事務(wù) A 讀取了事務(wù) B 未提交的數(shù)據(jù),并在這個基礎(chǔ)上又做了其他操作王污。
幻讀:符合查詢條件的數(shù)據(jù)集罢吃,在事務(wù)執(zhí)行過程中發(fā)生了變化
例子: 需要給所有的用戶贈送10個金幣,需要以下幾步:
1. 讀出所有用戶列表
2. 給這些用戶增加10個金幣
3. 提交事務(wù)
=> 問題: 在處理過程中昭齐,如果有新用戶進(jìn)來尿招,他們得不到10金幣的贈送,那么阱驾,本次事務(wù)操作操作不符合事務(wù)預(yù)期
不可重復(fù)讀:在事務(wù)的執(zhí)行過程中就谜,已經(jīng)讀到的數(shù)據(jù)的值,發(fā)生了變化(可重復(fù)讀:讀多少次得到的數(shù)據(jù)都是一樣的)
例子:
在事務(wù)A中里覆,讀取到張三的工資為5000丧荐,操作沒有完成,事務(wù)還沒提交喧枷。
與此同時虹统,事務(wù)B把張三的工資改為8000弓坞,并提交了事務(wù)。
隨后车荔,在事務(wù)A中渡冻,再次讀取張三的工資,此時工資變?yōu)?000忧便。在一個事務(wù)中前后兩次讀取的結(jié)果并不致族吻。
=> 問題:如果是類似于銀行的對賬系統(tǒng),這類不一致性帶來的問題會十分明顯
幻讀和不可重復(fù)讀的理解:
我們操作一個事務(wù)茬腿,涉及數(shù)據(jù)集A, 在整個事務(wù)操作過程中,如果數(shù)據(jù)集A存在被其他事務(wù)提交修改的可能宜雀,則會產(chǎn)生讀取不一致性
即使所有寫入系統(tǒng)的數(shù)據(jù)切平,都是遵循原子性的事務(wù)操作完成;
然而讀到的系統(tǒng)數(shù)據(jù)狀態(tài)辐董,和事務(wù)操作過程中面對的系統(tǒng)數(shù)據(jù)狀態(tài)存在不一致的可能悴品,導(dǎo)致事務(wù)操作不符合業(yè)務(wù)預(yù)期邏輯
更多沖突的具體場景參見:?參考資料【1】
我們很容易想到一個方法,那就是對所有數(shù)據(jù)整體加一把鎖简烘,一次只能執(zhí)行一個事務(wù)~
Yes, 問題解決了苔严,但是性能沒了,一個事務(wù)可能要操作n步孤澎,假設(shè)耗時100毫秒届氢,天哪,一天只能處理100萬不到的交易量
為了解決一致性和性能的矛盾覆旭,前輩們引入了隔離性的概念退子,用不同級別的隔離性,解決并發(fā)和一致性型将、性能的矛盾
特性三: 隔離性
定義:引入的隔離機(jī)制寂祥,并發(fā)的事務(wù)操作,不會相互影響事務(wù)的正確性七兜,進(jìn)而避免事務(wù)的相互影響丸凭,破壞整個系統(tǒng)的一致性。
=> 對一個事務(wù)來說腕铸,除非它所涉及的數(shù)據(jù)是靜態(tài)不變的惜犀,否則這個事務(wù)應(yīng)該對所有數(shù)據(jù)無損的失敗/回滾。
為了解決隔離性的需求狠裹,前人抽象出了4個隔離級別向拆,本文先列出來,下一篇文章講實(shí)現(xiàn)酪耳,那么對4種隔離級別浓恳,就更加清晰了
特性四:持久性
持久性是比較好理解的刹缝,當(dāng)我們執(zhí)行一條 insert 語句后,數(shù)據(jù)庫必須要保證有一條數(shù)據(jù)永久地存放在磁盤中颈将,這個也算事務(wù)的一條特性梢夯。
持久性,更多的關(guān)注的是系統(tǒng)容災(zāi)性晴圾,不會因?yàn)榈讓酉到y(tǒng)的異常颂砸、崩潰、掉電導(dǎo)致操作的丟失
參考資料
【1】https://blog.csdn.net/lovesomnus/article/details/44459675