分布式事務(wù)解決方案-什么是分布式事務(wù)

在分布式系統(tǒng)開發(fā)中,分布式事務(wù)屬于業(yè)界難題,接下來陸續(xù)發(fā)布分布式事務(wù)解決方案相關(guān)的文章。

1.什么是事務(wù)

? 什么是事務(wù)?舉個(gè)生活中的例子:你去小賣鋪買東西,“一手交錢,一手交貨”就是一個(gè)事務(wù)的例子,交錢和交貨必須全部成功,事務(wù)才算成功,任一個(gè)活動(dòng)失敗,事務(wù)將撤銷所有已成功的活動(dòng)。

? 明白上述例子,再來看事務(wù)的定義:

??事務(wù)可以看做是一次大的活動(dòng),它由不同的小活動(dòng)組成,這些活動(dòng)要么全部成功,要么全部失敗。

2.本地事務(wù)

? 在計(jì)算機(jī)系統(tǒng)中,更多的是通過關(guān)系型數(shù)據(jù)庫來控制事務(wù),這是利用數(shù)據(jù)庫本身的事務(wù)特性來實(shí)現(xiàn)的,因此叫數(shù)據(jù)庫事務(wù),由于應(yīng)用主要靠關(guān)系數(shù)據(jù)庫來控制事務(wù),而數(shù)據(jù)庫通常和應(yīng)用在同一個(gè)服務(wù)器,所以基于關(guān)系型數(shù)據(jù)庫的事務(wù)又被稱為本地事務(wù)。

? 回顧一下數(shù)據(jù)庫事務(wù)的四大特性 ACID:

??A(Atomic):原子性,構(gòu)成事務(wù)的所有操作,要么都執(zhí)行完成,要么全部不執(zhí)行,不可能出現(xiàn)部分成功部分失敗的情況。

??C(Consistency):一致性,在事務(wù)執(zhí)行前后,數(shù)據(jù)庫的一致性約束沒有被破壞。比如:張三向李四轉(zhuǎn)100元,轉(zhuǎn)賬前和轉(zhuǎn)賬后的數(shù)據(jù)是正確狀態(tài)這叫一致性,如果出現(xiàn)張三轉(zhuǎn)出100元,李四賬戶沒有增加100元這就出現(xiàn)了數(shù)據(jù)錯(cuò)誤,就沒有達(dá)到一致性。

??I(Isolation):隔離性,數(shù)據(jù)庫中的事務(wù)一般都是并發(fā)的,隔離性是指并發(fā)的兩個(gè)事務(wù)的執(zhí)行互不干擾,一個(gè)事務(wù)不能看到其他事務(wù)運(yùn)行過程的中間狀態(tài)。通過配置事務(wù)隔離級(jí)別可以避臟讀、重復(fù)讀等問題。

??D(Durability):持久性,事務(wù)完成之后,該事務(wù)對(duì)數(shù)據(jù)的更改會(huì)被持久化到數(shù)據(jù)庫,且不會(huì)被回滾。

??數(shù)據(jù)庫事務(wù)在實(shí)現(xiàn)時(shí)會(huì)將一次事務(wù)涉及的所有操作全部納入到一個(gè)不可分割的執(zhí)行單元,該執(zhí)行單元中的所有操作要么都成功,要么都失敗,只要其中任一操作執(zhí)行失敗,都將導(dǎo)致整個(gè)事務(wù)的回滾

3.什么是分布式事務(wù)

? 隨著互聯(lián)網(wǎng)的快速發(fā)展,軟件系統(tǒng)由原來的單體應(yīng)用轉(zhuǎn)變?yōu)榉植际綉?yīng)用,下圖描述了單體應(yīng)用向微服務(wù)的演變:

? 分布式系統(tǒng)會(huì)把一個(gè)應(yīng)用系統(tǒng)拆分為可獨(dú)立部署的多個(gè)服務(wù),因此需要服務(wù)與服務(wù)之間遠(yuǎn)程協(xié)作才能完成事務(wù)操作,這種分布式系統(tǒng)環(huán)境下由不同的服務(wù)之間通過網(wǎng)絡(luò)遠(yuǎn)程協(xié)作完成事務(wù)稱之為分布式事務(wù),例如用戶注冊(cè)送積分事務(wù)、創(chuàng)建訂單減庫存事務(wù),銀行轉(zhuǎn)賬事務(wù)等都是分布式事務(wù)。

我們知道本地事務(wù)依賴數(shù)據(jù)庫本身提供的事務(wù)特性來實(shí)現(xiàn),因此以下邏輯可以控制本地事務(wù):

begin transaction;

//1.本地?cái)?shù)據(jù)庫操作:張三減少金額

//2.本地?cái)?shù)據(jù)庫操作:李四增加金額

commit transation;

但是在分布式環(huán)境下,會(huì)變成下邊這樣:

begin transaction;

//1.本地?cái)?shù)據(jù)庫操作:張三減少金額

//2.遠(yuǎn)程調(diào)用:讓李四增加金額

commit transation;

可以設(shè)想,當(dāng)遠(yuǎn)程調(diào)用讓李四增加金額成功了,由于網(wǎng)絡(luò)問題遠(yuǎn)程調(diào)用并沒有返回,此時(shí)本地事務(wù)提交失敗就回滾了張三減少金額的操作,此時(shí)張三和李四的數(shù)據(jù)就不一致了。

因此在分布式架構(gòu)的基礎(chǔ)上,傳統(tǒng)數(shù)據(jù)庫事務(wù)就無法使用了,張三和李四的賬戶不在一個(gè)數(shù)據(jù)庫中甚至不在一個(gè)應(yīng)用系統(tǒng)里,實(shí)現(xiàn)轉(zhuǎn)賬事務(wù)需要通過遠(yuǎn)程調(diào)用,由于網(wǎng)絡(luò)問題就會(huì)導(dǎo)致分布式事務(wù)問題。

4.分布式事務(wù)產(chǎn)生的場(chǎng)景

1、典型的場(chǎng)景就是微服務(wù)架構(gòu) 微服務(wù)之間通過遠(yuǎn)程調(diào)用完成事務(wù)操作。 比如:訂單微服務(wù)和庫存微服務(wù),下單的同時(shí)訂單微服務(wù)請(qǐng)求庫存微服務(wù)減庫存。 簡言之:跨JVM進(jìn)程產(chǎn)生分布式事務(wù)。

2、單體系統(tǒng)訪問多個(gè)數(shù)據(jù)庫實(shí)例 當(dāng)單體系統(tǒng)需要訪問多個(gè)數(shù)據(jù)庫(實(shí)例)時(shí)就會(huì)產(chǎn)生分布式事務(wù)。 比如:用戶信息和訂單信息分別在兩個(gè)MySQL實(shí)例存儲(chǔ),用戶管理系統(tǒng)刪除用戶信息,需要分別刪除用戶信息及用戶的訂單信息,由于數(shù)據(jù)分布在不同的數(shù)據(jù)實(shí)例,需要通過不同的數(shù)據(jù)庫鏈接去操作數(shù)據(jù),此時(shí)產(chǎn)生分布式事務(wù)。 簡言之:跨數(shù)據(jù)庫實(shí)例產(chǎn)生分布式事務(wù)。

3、多服務(wù)訪問同一個(gè)數(shù)據(jù)庫實(shí)例 比如:訂單微服務(wù)和庫存微服務(wù)即使訪問同一個(gè)數(shù)據(jù)庫也會(huì)產(chǎn)生分布式事務(wù),原因就是跨JVM進(jìn)程,兩個(gè)微服務(wù)持有了不同的數(shù)據(jù)庫鏈接進(jìn)行數(shù)據(jù)庫操作,此時(shí)產(chǎn)生分布式事務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容