事務(wù)和數(shù)據(jù)庫(kù)有關(guān)系嗎?終于有一篇文章把“事務(wù)”講清楚了!
不知道你是否遇到這樣的場(chǎng)景,去小賣鋪買東西,付了錢,但店主突然有事情需要去處理,等處理回來之后給到你的貨物與你最開始想要買的不一致,或許多了,或許少了,或許拿錯(cuò)了,甚至是間歇性失憶忘記你曾經(jīng)付過錢反而要求你重新付錢了。
又或是在線購(gòu)物時(shí),付款成功后可以增加積分,但是個(gè)人積分卻沒有任何變動(dòng),或者是明明成功付款了,過一會(huì)兒店小二聯(lián)系你說沒有庫(kù)存了希望你能申請(qǐng)下退款。這所有的事情總結(jié)起來就是某個(gè)操作的期望與實(shí)際不一致,而這背后的原因就是沒有事務(wù)。
那么事務(wù)是什么呢?事務(wù)是一種工作機(jī)制,它把一個(gè)活動(dòng)所涉及的其他所有操作都放入一個(gè)不可分割的執(zhí)行單元,只有所有的操作都執(zhí)行成功,事務(wù)才算完成,否則整個(gè)事務(wù)就不成功,回到原始狀態(tài)。
有了事務(wù),你去小賣鋪買東西的時(shí)候,你付錢、店主給你對(duì)應(yīng)的貨品、店主減掉庫(kù)存這三個(gè)操作都完成后,整個(gè)買東西的操作才算完成,如果你沒有付錢或者店主沒有給到你對(duì)應(yīng)的貨品,那么這個(gè)事務(wù)就算是執(zhí)行失敗,就會(huì)回到最初的狀態(tài),錢還是你的錢,貨還是商家的貨,不增不減。
事務(wù)主要使用在數(shù)據(jù)庫(kù)場(chǎng)合,有本地事務(wù)、分布式事務(wù)兩種業(yè)態(tài)。
對(duì)于數(shù)據(jù)庫(kù)本地事務(wù)來說,這個(gè)很好理解,因?yàn)樯婕皵?shù)據(jù)的內(nèi)容都會(huì)存在數(shù)據(jù)庫(kù)里,而數(shù)據(jù)改動(dòng)中最重要的就是對(duì)金錢財(cái)產(chǎn)有改動(dòng)的內(nèi)容,需要通過事務(wù)去保障,不然你付了錢,卻不給你發(fā)貨,你是不是要去找賣家申訴,而平臺(tái)老出問題,賣家是不是要去找平臺(tái)申訴,環(huán)環(huán)相扣,最終會(huì)影響一大波人,因此事務(wù)是非常重要的。
對(duì)于分布式事務(wù),這個(gè)主要是由于分布式架構(gòu)、微服務(wù)的出現(xiàn)產(chǎn)生的,分布式事務(wù)的一致性也同等重要。
數(shù)庫(kù)事務(wù)最重要的特點(diǎn)就是ACID,即原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durability。所謂原子性就是事務(wù)中所涉及的所有操作,是一個(gè)最小的不可分割的,要么全部完成,要么全部不完成,如果事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,則回滾到事務(wù)開始前的狀態(tài),就像你買東西一樣,要么交錢收貨一起完成,否則就不給錢或不發(fā)貨。
所謂一致性就是事務(wù)在執(zhí)行前后數(shù)據(jù)庫(kù)內(nèi)容要一致,就像你買東西一樣,買之前商家的售貨額與商品庫(kù)存分別是100、1000,在你買之前,所有的人來買東西時(shí)商家的售貨額和庫(kù)存均是100、1000,你花了50塊錢成功買了100件物品,那么商家的售貨額與庫(kù)存變?yōu)?50、900,所有的人來買東西時(shí)商家的售貨額和庫(kù)存均是150、900,商家的個(gè)人數(shù)據(jù)庫(kù)始終一致。
所謂隔離性就是在并發(fā)環(huán)境中,不同的食物操作相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)獨(dú)立執(zhí)行,互不影響,就像你去小賣鋪買東西,并不影響其它人也來小賣鋪買東西,但是你買貨結(jié)賬時(shí)的售貨額和庫(kù)存一定是個(gè)確定值,不會(huì)看到中間態(tài)。所謂持久性是指只要事務(wù)成功結(jié)束,那么數(shù)據(jù)庫(kù)會(huì)更新記錄,即使發(fā)生系統(tǒng)崩潰、重啟數(shù)據(jù)庫(kù)系統(tǒng)后,數(shù)據(jù)庫(kù)也還能恢復(fù)到事務(wù)成功結(jié)束時(shí)的狀態(tài),就像你去小賣鋪買東西,所有的交易記錄老板都記錄在賬本上,即使老板忘記了也還可以查帳本。
隨著互聯(lián)網(wǎng)用戶和流量的劇增,業(yè)務(wù)架構(gòu)模式開始拆分成微服務(wù)、業(yè)務(wù)部署模式變?yōu)榉植际健?/span>
所謂微服務(wù)架構(gòu)就是把原來一體化的應(yīng)用拆分成能獨(dú)立完成功能的原子化模塊,比如電商系統(tǒng)服務(wù)可拆分成用戶管理微服務(wù)、商品管理微服務(wù)、訂單管理微服務(wù)、庫(kù)存管理微服務(wù)、交易管理微服務(wù)等模塊,原先在一套系統(tǒng)內(nèi)可以完成的付款、減庫(kù)存、加訂單的事務(wù)操作現(xiàn)在要分散在交易管理、訂單管理、庫(kù)存管理三個(gè)子模塊完成,本地事務(wù)變成分布式事務(wù)。所謂分布式部署則是為了容災(zāi)與高可用,將重要的、最常用的服務(wù)多個(gè)節(jié)點(diǎn)部署,保障無論何時(shí)服務(wù)都能正常響應(yīng),比如將電商系統(tǒng)服務(wù)中的商品管理在北京、上海、杭州、深圳都部署一套,訂單管理、庫(kù)存管理、交易管理等部署杭州,當(dāng)用戶在北京發(fā)生一筆交易時(shí),需要杭州的服務(wù)與北京的服務(wù)通信,共同完成任務(wù),從而本地事務(wù)變成分布式事務(wù)。
分布式事務(wù)的產(chǎn)生是必然,那么又如何保障分布式事務(wù)的一致性呢?業(yè)內(nèi)的解法有CAP理論、BASE理論,CAP理論即一致性Consistency、可用性Availability、分區(qū)容錯(cuò)性Partitiontolerance三者不能共存,要么保障系統(tǒng)的可用性AP、要么保障系統(tǒng)的一致性CP。
這是因?yàn)镃AP是在分布式部署、微服務(wù)架構(gòu)的情況下提出來的,所以分區(qū)一定存在,如果為了保障數(shù)據(jù)的一致性,那么當(dāng)用戶在北京服務(wù)節(jié)點(diǎn)發(fā)生交易時(shí),杭州的服務(wù)節(jié)點(diǎn)就不能使用,得等到整個(gè)交易完成了才能進(jìn)行,這時(shí)候就出現(xiàn)了可用性缺失,如果為了保障系統(tǒng)的可用性,用戶在北京服務(wù)節(jié)點(diǎn)的交易和杭州服務(wù)節(jié)點(diǎn)的數(shù)據(jù)因?yàn)榇嬖跀?shù)據(jù)傳輸延遲,數(shù)據(jù)必然會(huì)不一致,所以一致性和可用性只能二選一。
對(duì)于電商平臺(tái)來說,因?yàn)楦采w的用戶廣,無論如何都要保障業(yè)務(wù)隨時(shí)可用,對(duì)于數(shù)據(jù)的準(zhǔn)確性可以接受一定的錯(cuò)誤,而對(duì)于交易系統(tǒng)來說,涉及到用戶財(cái)產(chǎn),那是一分一毫都不能少,所以數(shù)據(jù)的一致性非常重要。
BASE理論即基本可用BasicallyAvailable、軟狀態(tài)SoftState、最終一致性EventuallyConsistent,是對(duì)于CAP定論中的AP的擴(kuò)展。所謂基本可用是指分布式系統(tǒng)在出現(xiàn)故障時(shí),允許部分非核心業(yè)務(wù)功能不可用,保障核心功能可用。所謂軟狀態(tài)是指分布式系統(tǒng)中允許存在中間狀態(tài),允許部分出錯(cuò)。所謂最終一致是指經(jīng)過一段時(shí)間后,所有分布式節(jié)點(diǎn)數(shù)據(jù)達(dá)到一致。
分布式事務(wù)是在互聯(lián)網(wǎng)的飛速發(fā)展下應(yīng)運(yùn)而生。在我們的業(yè)務(wù)系統(tǒng)中究竟采取本地事務(wù)還是分布式事務(wù)應(yīng)當(dāng)視具體情況而定,不能為了分布式而分布式。如果真的必須分布式,那么需要結(jié)合自己的業(yè)務(wù)類型選擇合適的模式,可用性、強(qiáng)一致性、最終一致性都是可行解。