這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么進(jìn)行分布式事務(wù)淺析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
十年的江北網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整江北建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“江北網(wǎng)站設(shè)計(jì)”,“江北網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。什么是分布式系統(tǒng),這對(duì)后端工程師來(lái)說(shuō)是很重要的一門學(xué)問(wèn),我們會(huì)逐步了解常見(jiàn)的分布式技術(shù)、以及一些較為常見(jiàn)的分布式系統(tǒng)概念,同時(shí)也需要進(jìn)一步了解zookeeper、分布式事務(wù)、分布式鎖、負(fù)載均衡等技術(shù),以便讓你更完整地了解分布式技術(shù)的具體實(shí)戰(zhàn)方法,為真正應(yīng)用分布式技術(shù)做好準(zhǔn)備。
眾所周知,數(shù)據(jù)庫(kù)能實(shí)現(xiàn)本地事務(wù),也就是在同一個(gè)數(shù)據(jù)庫(kù)中,你可以允許一組操作要么全都正確執(zhí)行,要么全都不執(zhí)行。這里特別強(qiáng)調(diào)了本地事務(wù),也就是目前的數(shù)據(jù)庫(kù)只能支持同一個(gè)數(shù)據(jù)庫(kù)中的事務(wù)。但現(xiàn)在的系統(tǒng)往往采用微服務(wù)架構(gòu),業(yè)務(wù)系統(tǒng)擁有獨(dú)立的數(shù)據(jù)庫(kù),因此就出現(xiàn)了跨多個(gè)數(shù)據(jù)庫(kù)的事務(wù)需求,這種事務(wù)即為“分布式事務(wù)”。那么在目前數(shù)據(jù)庫(kù)不支持跨庫(kù)事務(wù)的情況下,我們應(yīng)該如何實(shí)現(xiàn)分布式事務(wù)呢?本文首先會(huì)為大家梳理分布式事務(wù)的基本概念和理論基礎(chǔ),然后介紹幾種目前常用的分布式事務(wù)解決方案。廢話不多說(shuō),那就開(kāi)始吧~
什么是事務(wù)?
事務(wù)由一組操作構(gòu)成,我們希望這組操作能夠全部正確執(zhí)行,如果這一組操作中的任意一個(gè)步驟發(fā)生錯(cuò)誤,那么就需要回滾之前已經(jīng)完成的操作。也就是同一個(gè)事務(wù)中的所有操作,要么全都正確執(zhí)行,要么全都不要執(zhí)行。
事務(wù)的四大特性 ACID
說(shuō)到事務(wù),就不得不提一下事務(wù)著名的四大特性。
原子性原子性要求,事務(wù)是一個(gè)不可分割的執(zhí)行單元,事務(wù)中的所有操作要么全都執(zhí)行,要么全都不執(zhí)行。
一致性一致性要求,事務(wù)在開(kāi)始前和結(jié)束后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞。
隔離性事務(wù)的執(zhí)行是相互獨(dú)立的,它們不會(huì)相互干擾,一個(gè)事務(wù)不會(huì)看到另一個(gè)正在運(yùn)行過(guò)程中的事務(wù)的數(shù)據(jù)。
持久性持久性要求,一個(gè)事務(wù)完成之后,事務(wù)的執(zhí)行結(jié)果必須是持久化保存的。即使數(shù)據(jù)庫(kù)發(fā)生崩潰,在數(shù)據(jù)庫(kù)恢復(fù)后事務(wù)提交的結(jié)果仍然不會(huì)丟失。
注意:事務(wù)只能保證數(shù)據(jù)庫(kù)的高可靠性,即數(shù)據(jù)庫(kù)本身發(fā)生問(wèn)題后,事務(wù)提交后的數(shù)據(jù)仍然能恢復(fù);而如果不是數(shù)據(jù)庫(kù)本身的故障,如硬盤損壞了,那么事務(wù)提交的數(shù)據(jù)可能就丟失了。這屬于『高可用性』的范疇。因此,事務(wù)只能保證數(shù)據(jù)庫(kù)的『高可靠性』,而『高可用性』需要整個(gè)系統(tǒng)共同配合實(shí)現(xiàn)。
事務(wù)的隔離級(jí)別
這里擴(kuò)展一下,對(duì)事務(wù)的隔離性做一個(gè)詳細(xì)的解釋。
在事務(wù)的四大特性ACID中,要求的隔離性是一種嚴(yán)格意義上的隔離,也就是多個(gè)事務(wù)是串行執(zhí)行的,彼此之間不會(huì)受到任何干擾。這確實(shí)能夠完全保證數(shù)據(jù)的安全性,但在實(shí)際業(yè)務(wù)系統(tǒng)中,這種方式性能不高。因此,數(shù)據(jù)庫(kù)定義了四種隔離級(jí)別,隔離級(jí)別和數(shù)據(jù)庫(kù)的性能是呈反比的,隔離級(jí)別越低,數(shù)據(jù)庫(kù)性能越高,而隔離級(jí)別越高,數(shù)據(jù)庫(kù)性能越差。
事務(wù)并發(fā)執(zhí)行會(huì)出現(xiàn)的問(wèn)題
我們先來(lái)看一下在不同的隔離級(jí)別下,數(shù)據(jù)庫(kù)可能會(huì)出現(xiàn)的問(wèn)題:
更新丟失當(dāng)有兩個(gè)并發(fā)執(zhí)行的事務(wù),更新同一行數(shù)據(jù),那么有可能一個(gè)事務(wù)會(huì)把另一個(gè)事務(wù)的更新覆蓋掉。當(dāng)數(shù)據(jù)庫(kù)沒(méi)有加任何鎖操作的情況下會(huì)發(fā)生。
臟讀一個(gè)事務(wù)讀到另一個(gè)尚未提交的事務(wù)中的數(shù)據(jù)。該數(shù)據(jù)可能會(huì)被回滾從而失效。如果第一個(gè)事務(wù)拿著失效的數(shù)據(jù)去處理那就發(fā)生錯(cuò)誤了。
不可重復(fù)讀不可重復(fù)度的含義:一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)讀了兩次,卻得到了不同的結(jié)果。它具體分為如下兩種情況:
虛讀:在事務(wù)1兩次讀取同一記錄的過(guò)程中,事務(wù)2對(duì)該記錄進(jìn)行了修改,從而事務(wù)1第二次讀到了不一樣的記錄。
幻讀:事務(wù)1在兩次查詢的過(guò)程中,事務(wù)2對(duì)該表進(jìn)行了插入、刪除操作,從而事務(wù)1第二次查詢的結(jié)果發(fā)生了變化。
不可重復(fù)讀 與 臟讀 的區(qū)別?臟讀讀到的是尚未提交的數(shù)據(jù),而不可重復(fù)讀讀到的是已經(jīng)提交的數(shù)據(jù),只不過(guò)在兩次讀的過(guò)程中數(shù)據(jù)被另一個(gè)事務(wù)改過(guò)了。
數(shù)據(jù)庫(kù)的四種隔離級(jí)別
數(shù)據(jù)庫(kù)一共有如下四種隔離級(jí)別:
Read uncommitted 讀未提交在該級(jí)別下,一個(gè)事務(wù)對(duì)一行數(shù)據(jù)修改的過(guò)程中,不允許另一個(gè)事務(wù)對(duì)該行數(shù)據(jù)進(jìn)行修改,但允許另一個(gè)事務(wù)對(duì)該行數(shù)據(jù)讀。因此本級(jí)別下,不會(huì)出現(xiàn)更新丟失,但會(huì)出現(xiàn)臟讀、不可重復(fù)讀。
Read committed 讀提交在該級(jí)別下,未提交的寫事務(wù)不允許其他事務(wù)訪問(wèn)該行,因此不會(huì)出現(xiàn)臟讀;但是讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)的訪問(wèn)該行數(shù)據(jù),因此會(huì)出現(xiàn)不可重復(fù)讀的情況。
Repeatable read 重復(fù)讀在該級(jí)別下,讀事務(wù)禁止寫事務(wù),但允許讀事務(wù),因此不會(huì)出現(xiàn)同一事務(wù)兩次讀到不同的數(shù)據(jù)的情況(不可重復(fù)讀),且寫事務(wù)禁止其他一切事務(wù)。
Serializable 序列化該級(jí)別要求所有事務(wù)都必須串行執(zhí)行,因此能避免一切因并發(fā)引起的問(wèn)題,但效率很低。
隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed。它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀和第二類丟失更新這些并發(fā)問(wèn)題,在可能出現(xiàn)這類問(wèn)題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂(lè)觀鎖來(lái)控制。
什么是分布式事務(wù)?
到此為止,所介紹的事務(wù)都是基于單數(shù)據(jù)庫(kù)的本地事務(wù),目前的數(shù)據(jù)庫(kù)僅支持單庫(kù)事務(wù),并不支持跨庫(kù)事務(wù)。而隨著微服務(wù)架構(gòu)的普及,一個(gè)大型業(yè)務(wù)系統(tǒng)往往由若干個(gè)子系統(tǒng)構(gòu)成,這些子系統(tǒng)又擁有各自獨(dú)立的數(shù)據(jù)庫(kù)。往往一個(gè)業(yè)務(wù)流程需要由多個(gè)子系統(tǒng)共同完成,而且這些操作可能需要在一個(gè)事務(wù)中完成。在微服務(wù)系統(tǒng)中,這些業(yè)務(wù)場(chǎng)景是普遍存在的。此時(shí),我們就需要在數(shù)據(jù)庫(kù)之上通過(guò)某種手段,實(shí)現(xiàn)支持跨數(shù)據(jù)庫(kù)的事務(wù)支持,這也就是大家常說(shuō)的“分布式事務(wù)”。
這里舉一個(gè)分布式事務(wù)的典型例子——用戶下單過(guò)程。當(dāng)我們的系統(tǒng)采用了微服務(wù)架構(gòu)后,一個(gè)電商系統(tǒng)往往被拆分成如下幾個(gè)子系統(tǒng):商品系統(tǒng)、訂單系統(tǒng)、支付系統(tǒng)、積分系統(tǒng)等。整個(gè)下單的過(guò)程如下:
用戶通過(guò)商品系統(tǒng)瀏覽商品,他看中了某一項(xiàng)商品,便點(diǎn)擊下單
此時(shí)訂單系統(tǒng)會(huì)生成一條訂單
訂單創(chuàng)建成功后,支付系統(tǒng)提供支付功能
當(dāng)支付完成后,由積分系統(tǒng)為該用戶增加積分
上述步驟2、3、4需要在一個(gè)事務(wù)中完成。對(duì)于傳統(tǒng)單體應(yīng)用而言,實(shí)現(xiàn)事務(wù)非常簡(jiǎn)單,只需將這三個(gè)步驟放在一個(gè)方法A中,再用Spring的
@Transactional注解標(biāo)識(shí)該方法即可。Spring通過(guò)數(shù)據(jù)庫(kù)的事務(wù)支持,保證這些步驟要么全都執(zhí)行完成,要么全都不執(zhí)行。但在這個(gè)微服務(wù)架構(gòu)中,這三個(gè)步驟涉及三個(gè)系統(tǒng),涉及三個(gè)數(shù)據(jù)庫(kù),此時(shí)我們必須在數(shù)據(jù)庫(kù)和應(yīng)用系統(tǒng)之間,通過(guò)某項(xiàng)黑科技,實(shí)現(xiàn)分布式事務(wù)的支持。
CAP理論
CAP理論說(shuō)的是:在一個(gè)分布式系統(tǒng)中,最多只能滿足C、A、P中的兩個(gè)需求。
CAP的含義:
C:Consistency 一致性同一數(shù)據(jù)的多個(gè)副本是否實(shí)時(shí)相同。
A:Availability 可用性可用性:一定時(shí)間內(nèi) & 系統(tǒng)返回一個(gè)明確的結(jié)果 則稱為該系統(tǒng)可用。
P:Partition tolerance 分區(qū)容錯(cuò)性將同一服務(wù)分布在多個(gè)系統(tǒng)中,從而保證某一個(gè)系統(tǒng)宕機(jī),仍然有其他系統(tǒng)提供相同的服務(wù)。
CAP理論告訴我們,在分布式系統(tǒng)中,C、A、P三個(gè)條件中我們最多只能選擇兩個(gè)。那么問(wèn)題來(lái)了,究竟選擇哪兩個(gè)條件較為合適呢?
對(duì)于一個(gè)業(yè)務(wù)系統(tǒng)來(lái)說(shuō),可用性和分區(qū)容錯(cuò)性是必須要滿足的兩個(gè)條件,并且這兩者是相輔相成的。業(yè)務(wù)系統(tǒng)之所以使用分布式系統(tǒng),主要原因有兩個(gè):
提升整體性能當(dāng)業(yè)務(wù)量猛增,單個(gè)服務(wù)器已經(jīng)無(wú)法滿足我們的業(yè)務(wù)需求的時(shí)候,就需要使用分布式系統(tǒng),使用多個(gè)節(jié)點(diǎn)提供相同的功能,從而整體上提升系統(tǒng)的性能,這就是使用分布式系統(tǒng)的第一個(gè)原因。
實(shí)現(xiàn)分區(qū)容錯(cuò)性單一節(jié)點(diǎn) 或 多個(gè)節(jié)點(diǎn)處于相同的網(wǎng)絡(luò)環(huán)境下,那么會(huì)存在一定的風(fēng)險(xiǎn),萬(wàn)一該機(jī)房斷電、該地區(qū)發(fā)生自然災(zāi)害,那么業(yè)務(wù)系統(tǒng)就全面癱瘓了。為了防止這一問(wèn)題,采用分布式系統(tǒng),將多個(gè)子系統(tǒng)分布在不同的地域、不同的機(jī)房中,從而保證系統(tǒng)高可用性。
這說(shuō)明分區(qū)容錯(cuò)性是分布式系統(tǒng)的根本,如果分區(qū)容錯(cuò)性不能滿足,那使用分布式系統(tǒng)將失去意義。
此外,可用性對(duì)業(yè)務(wù)系統(tǒng)也尤為重要。在大談?dòng)脩趔w驗(yàn)的今天,如果業(yè)務(wù)系統(tǒng)時(shí)常出現(xiàn)“系統(tǒng)異常”、響應(yīng)時(shí)間過(guò)長(zhǎng)等情況,這使得用戶對(duì)系統(tǒng)的好感度大打折扣,在互聯(lián)網(wǎng)行業(yè)競(jìng)爭(zhēng)激烈的今天,相同領(lǐng)域的競(jìng)爭(zhēng)者不甚枚舉,系統(tǒng)的間歇性不可用會(huì)立馬導(dǎo)致用戶流向競(jìng)爭(zhēng)對(duì)手。因此,我們只能通過(guò)犧牲一致性來(lái)?yè)Q取系統(tǒng)的可用性和分區(qū)容錯(cuò)性。這也就是下面要介紹的BASE理論。
BASE理論
CAP理論告訴我們一個(gè)悲慘但不得不接受的事實(shí)——我們只能在C、A、P中選擇兩個(gè)條件。而對(duì)于業(yè)務(wù)系統(tǒng)而言,我們往往選擇犧牲一致性來(lái)?yè)Q取系統(tǒng)的可用性和分區(qū)容錯(cuò)性。不過(guò)這里要指出的是,所謂的“犧牲一致性”并不是完全放棄數(shù)據(jù)一致性,而是犧牲強(qiáng)一致性換取弱一致性。下面來(lái)介紹下BASE理論。
BA:Basic Available 基本可用
整個(gè)系統(tǒng)在某些不可抗力的情況下,仍然能夠保證“可用性”,即一定時(shí)間內(nèi)仍然能夠返回一個(gè)明確的結(jié)果。只不過(guò)“基本可用”和“高可用”的區(qū)別是:
“一定時(shí)間”可以適當(dāng)延長(zhǎng)當(dāng)舉行大促時(shí),響應(yīng)時(shí)間可以適當(dāng)延長(zhǎng)
給部分用戶返回一個(gè)降級(jí)頁(yè)面給部分用戶直接返回一個(gè)降級(jí)頁(yè)面,從而緩解服務(wù)器壓力。但要注意,返回降級(jí)頁(yè)面仍然是返回明確結(jié)果。
S:Soft State:柔性狀態(tài)同一數(shù)據(jù)的不同副本的狀態(tài),可以不需要實(shí)時(shí)一致。
E:Eventual Consisstency:最終一致性同一數(shù)據(jù)的不同副本的狀態(tài),可以不需要實(shí)時(shí)一致,但一定要保證經(jīng)過(guò)一定時(shí)間后仍然是一致的。
酸堿平衡
ACID能夠保證事務(wù)的強(qiáng)一致性,即數(shù)據(jù)是實(shí)時(shí)一致的。這在本地事務(wù)中是沒(méi)有問(wèn)題的,在分布式事務(wù)中,強(qiáng)一致性會(huì)極大影響分布式系統(tǒng)的性能,因此分布式系統(tǒng)中遵循BASE理論即可。但分布式系統(tǒng)的不同業(yè)務(wù)場(chǎng)景對(duì)一致性的要求也不同。如交易場(chǎng)景下,就要求強(qiáng)一致性,此時(shí)就需要遵循ACID理論,而在注冊(cè)成功后發(fā)送短信驗(yàn)證碼等場(chǎng)景下,并不需要實(shí)時(shí)一致,因此遵循BASE理論即可。因此要根據(jù)具體業(yè)務(wù)場(chǎng)景,在ACID和BASE之間尋求平衡。
分布式事務(wù)協(xié)議
下面介紹幾種實(shí)現(xiàn)分布式事務(wù)的協(xié)議。
理解2PC和3PC協(xié)議
為了解決分布式一致性問(wèn)題,前人在性能和數(shù)據(jù)一致性的反反復(fù)復(fù)權(quán)衡過(guò)程中總結(jié)了許多典型的協(xié)議和算法。其中比較著名的有二階提交協(xié)議(2 Phase Commitment Protocol),三階提交協(xié)議(3 Phase Commitment Protocol)。
2PC
分布式事務(wù)最常用的解決方案就是二階段提交。在分布式系統(tǒng)中,每個(gè)節(jié)點(diǎn)雖然可以知曉自己的操作時(shí)成功或者失敗,卻無(wú)法知道其他節(jié)點(diǎn)的操作的成功或失敗。當(dāng)一個(gè)事務(wù)跨越多個(gè)節(jié)點(diǎn)時(shí),為了保持事務(wù)的ACID特性,需要引入一個(gè)作為協(xié)調(diào)者的組件來(lái)統(tǒng)一掌控所有參與者節(jié)點(diǎn)的操作結(jié)果并最終指示這些節(jié)點(diǎn)是否要把操作結(jié)果進(jìn)行真正的提交。
因此,二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報(bào)決定各參與者是否要提交操作還是中止操作。
所謂的兩個(gè)階段是指:第一階段:準(zhǔn)備階段(投票階段)和第二階段:提交階段(執(zhí)行階段)。
第一階段:投票階段
該階段的主要目的在于打探數(shù)據(jù)庫(kù)集群中的各個(gè)參與者是否能夠正常的執(zhí)行事務(wù),具體步驟如下:
協(xié)調(diào)者向所有的參與者發(fā)送事務(wù)執(zhí)行請(qǐng)求,并等待參與者反饋事務(wù)執(zhí)行結(jié)果。
事務(wù)參與者收到請(qǐng)求之后,執(zhí)行事務(wù),但不提交,并記錄事務(wù)日志。
參與者將自己事務(wù)執(zhí)行情況反饋給協(xié)調(diào)者,同時(shí)阻塞等待協(xié)調(diào)者的后續(xù)指令。
第二階段:事務(wù)提交階段
在第一階段協(xié)調(diào)者的詢盤之后,各個(gè)參與者會(huì)回復(fù)自己事務(wù)的執(zhí)行情況,這時(shí)候存在三種可能:
所有的參與者回復(fù)能夠正常執(zhí)行事務(wù)。
一個(gè)或多個(gè)參與者回復(fù)事務(wù)執(zhí)行失敗。
協(xié)調(diào)者等待超時(shí)。
對(duì)于第一種情況,協(xié)調(diào)者將向所有的參與者發(fā)出提交事務(wù)的通知,具體步驟如下:
協(xié)調(diào)者向各個(gè)參與者發(fā)送commit通知,請(qǐng)求提交事務(wù)。
參與者收到事務(wù)提交通知之后,執(zhí)行commit操作,然后釋放占有的資源。
參與者向協(xié)調(diào)者返回事務(wù)commit結(jié)果信息。
對(duì)于第二、三種情況,協(xié)調(diào)者均認(rèn)為參與者無(wú)法正常成功執(zhí)行事務(wù),為了整個(gè)集群數(shù)據(jù)的一致性,所以要向各個(gè)參與者發(fā)送事務(wù)回滾通知,具體步驟如下:
協(xié)調(diào)者向各個(gè)參與者發(fā)送事務(wù)rollback通知,請(qǐng)求回滾事務(wù)。
參與者收到事務(wù)回滾通知之后,執(zhí)行rollback操作,然后釋放占有的資源。
參與者向協(xié)調(diào)者返回事務(wù)rollback結(jié)果信息。
兩階段提交協(xié)議解決的是分布式數(shù)據(jù)庫(kù)數(shù)據(jù)強(qiáng)一致性問(wèn)題,其原理簡(jiǎn)單,易于實(shí)現(xiàn),但是缺點(diǎn)也是顯而易見(jiàn)的,主要缺點(diǎn)如下:
單點(diǎn)問(wèn)題:協(xié)調(diào)者在整個(gè)兩階段提交過(guò)程中扮演著舉足輕重的作用,一旦協(xié)調(diào)者所在服務(wù)器宕機(jī),那么就會(huì)影響整個(gè)數(shù)據(jù)庫(kù)集群的正常運(yùn)行,比如在第二階段中,如果協(xié)調(diào)者因?yàn)楣收喜荒苷0l(fā)送事務(wù)提交或回滾通知,那么參與者們將一直處于阻塞狀態(tài),整個(gè)數(shù)據(jù)庫(kù)集群將無(wú)法提供服務(wù)。
同步阻塞:兩階段提交執(zhí)行過(guò)程中,所有的參與者都需要聽(tīng)從協(xié)調(diào)者的統(tǒng)一調(diào)度,期間處于阻塞狀態(tài)而不能從事其他操作,這樣效率及其低下。
數(shù)據(jù)不一致性:兩階段提交協(xié)議雖然為分布式數(shù)據(jù)強(qiáng)一致性所設(shè)計(jì),但仍然存在數(shù)據(jù)不一致性的可能,比如在第二階段中,假設(shè)協(xié)調(diào)者發(fā)出了事務(wù)commit的通知,但是因?yàn)榫W(wǎng)絡(luò)問(wèn)題該通知僅被一部分參與者所收到并執(zhí)行了commit操作,其余的參與者則因?yàn)闆](méi)有收到通知一直處于阻塞狀態(tài),這時(shí)候就產(chǎn)生了數(shù)據(jù)的不一致性。
3PC
針對(duì)兩階段提交存在的問(wèn)題,三階段提交協(xié)議通過(guò)引入一個(gè)“預(yù)詢盤”階段,以及超時(shí)策略來(lái)減少整個(gè)集群的阻塞時(shí)間,提升系統(tǒng)性能。三階段提交的三個(gè)階段分別為:can_commit,pre_commit,do_commit。
第一階段:can_commit
該階段協(xié)調(diào)者會(huì)去詢問(wèn)各個(gè)參與者是否能夠正常執(zhí)行事務(wù),參與者根據(jù)自身情況回復(fù)一個(gè)預(yù)估值,相對(duì)于真正的執(zhí)行事務(wù),這個(gè)過(guò)程是輕量的,具體步驟如下:
協(xié)調(diào)者向各個(gè)參與者發(fā)送事務(wù)詢問(wèn)通知,詢問(wèn)是否可以執(zhí)行事務(wù)操作,并等待回復(fù)。
各個(gè)參與者依據(jù)自身狀況回復(fù)一個(gè)預(yù)估值,如果預(yù)估自己能夠正常執(zhí)行事務(wù)就返回確定信息,并進(jìn)入預(yù)備狀態(tài),否則返回否定信息。
第二階段:pre_commit
本階段協(xié)調(diào)者會(huì)根據(jù)第一階段的詢盤結(jié)果采取相應(yīng)操作,詢盤結(jié)果主要有三種:
所有的參與者都返回確定信息。
一個(gè)或多個(gè)參與者返回否定信息。
協(xié)調(diào)者等待超時(shí)。
針對(duì)第一種情況,協(xié)調(diào)者會(huì)向所有參與者發(fā)送事務(wù)執(zhí)行請(qǐng)求,具體步驟如下:
協(xié)調(diào)者向所有的事務(wù)參與者發(fā)送事務(wù)執(zhí)行通知。
參與者收到通知后,執(zhí)行事務(wù),但不提交。
參與者將事務(wù)執(zhí)行情況返回給客戶端。
在上面的步驟中,如果參與者等待超時(shí),則會(huì)中斷事務(wù)。 針對(duì)第二、三種情況,協(xié)調(diào)者認(rèn)為事務(wù)無(wú)法正常執(zhí)行,于是向各個(gè)參與者發(fā)出abort通知,請(qǐng)求退出預(yù)備狀態(tài),具體步驟如下:
協(xié)調(diào)者向所有事務(wù)參與者發(fā)送abort通知
參與者收到通知后,中斷事務(wù)
第三階段:do_commit
如果第二階段事務(wù)未中斷,那么本階段協(xié)調(diào)者將會(huì)依據(jù)事務(wù)執(zhí)行返回的結(jié)果來(lái)決定提交或回滾事務(wù),分為三種情況:
所有的參與者都能正常執(zhí)行事務(wù)。
一個(gè)或多個(gè)參與者執(zhí)行事務(wù)失敗。
協(xié)調(diào)者等待超時(shí)。
針對(duì)第一種情況,協(xié)調(diào)者向各個(gè)參與者發(fā)起事務(wù)提交請(qǐng)求,具體步驟如下:
協(xié)調(diào)者向所有參與者發(fā)送事務(wù)commit通知。
所有參與者在收到通知之后執(zhí)行commit操作,并釋放占有的資源。
參與者向協(xié)調(diào)者反饋事務(wù)提交結(jié)果。
針對(duì)第二、三種情況,協(xié)調(diào)者認(rèn)為事務(wù)無(wú)法正常執(zhí)行,于是向各個(gè)參與者發(fā)送事務(wù)回滾請(qǐng)求,具體步驟如下:
協(xié)調(diào)者向所有參與者發(fā)送事務(wù)rollback通知。
所有參與者在收到通知之后執(zhí)行rollback操作,并釋放占有的資源。
參與者向協(xié)調(diào)者反饋事務(wù)提交結(jié)果。
上述就是小編為大家分享的怎么進(jìn)行分布式事務(wù)淺析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。