亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫分布式事務產生的原因

發布時間:2021-08-30 21:45:59 來源:億速云 閱讀:160 作者:chen 欄目:大數據

這篇文章主要講解了“數據庫分布式事務產生的原因”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“數據庫分布式事務產生的原因”吧!

數據庫分布式事務

分布式事務

分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務器上,且屬于不同的應用,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。本質上來說,分布式事務就是為了保證不同數據庫的數據一致性。

事務的ACID特性

  • A 原子性: 在整個事務中的所有操作,要么全部完成,要么全部不做,沒有中間狀態。對于事務在執行中發生錯誤,所有的操作都會被回滾,整個事務就像從沒被執行過一樣。

  • C 一致性:事務的執行必須保證系統的一致性,就拿轉賬為例,A有500元,B有300元,如果在一個事務里A成功轉給B50元,那么不管并發多少,不管發生什么,只要事務執行成功了,那么最后A賬戶一定是450元,B賬戶一定是350元。

  • I 隔離性:所謂的隔離性就是說,事務與事務之間不會互相影響,一個事務的中間狀態不會被其他事務感知。

  • D持久性:所謂的持久性,就是說一單事務完成了,那么事務對數據所做的變更就完全保存在了數據庫中,即使發生停電,系統宕機也是如此。

分布式理論

當我們的單個數據庫的性能產生瓶頸的時候,我們可能會對數據庫進行分區,這里所說的分區指的是物理分區,分區之后可能不同的庫就處于不同的服務器上了,這個時候單個數據庫的ACID已經不能適應這種情況了,而在這種ACID的集群環境下,再想保證集群的ACID幾乎是很難達到,或者即使能達到那么效率和性能會大幅下降,最為關鍵的是再很難擴展新的分區了,這個時候如果再追求集群的ACID會導致我們的系統變得很差,這時我們就需要引入一個新的理論原則來適應這種集群的情況,就是 CAP 原則或者叫CAP定理,那么CAP定理指的是什么呢?

CAP定理

CAP定理是由加州大學伯克利分校Eric Brewer教授提出來的,他指出WEB服務無法同時滿足一下3個屬性:

一致性(Consistency) : 客戶端知道一系列的操作都會同時發生(生效)
可用性(Availability) : 每個操作都必須以可預期的響應結束
分區容錯性(Partition tolerance) : 即使出現單個組件無法可用,操作依然可以完成
具體地講在分布式系統中,在任何數據庫設計中,一個Web應用至多只能同時支持上面的兩個屬性。顯然,任何橫向擴展策略都要依賴于數據分區。因此,設計人員必須在一致性與可用性之間做出選擇。

這個定理在迄今為止的分布式系統中都是適用的! 為什么這么說呢?

這個時候有同學可能會把數據庫的2PC(兩階段提交)搬出來說話了。OK,我們就來看一下數據庫的兩階段提交。
對數據庫分布式事務有了解的同學一定知道數據庫支持的2PC,又叫做 XA Transactions。

MySQL從5.5版本開始支持,SQL Server 2005 開始支持,Oracle 7 開始支持。

其中,XA 是一個兩階段提交協議,該協議分為以下兩個階段:

第一階段:事務協調器要求每個涉及到事務的數據庫預提交(precommit)此操作,并反映是否可以提交.
第二階段:事務協調器要求每個數據庫提交數據。
其中,如果有任何一個數據庫否決此次提交,那么所有數據庫都會被要求回滾它們在此事務中的那部分信息。這樣做的缺陷是什么呢? 咋看之下我們可以在數據庫分區之間獲得一致性。

如果CAP 定理是對的,那么它一定會影響到可用性。

如果說系統的可用性代表的是執行某項操作相關所有組件的可用性的和。那么在兩階段提交的過程中,可用性就代表了涉及到的每一個數據庫中可用性的和。我們假設兩階段提交的過程中每一個數據庫都具有99.9%的可用性,那么如果兩階段提交涉及到兩個數據庫,這個結果就是99.8%。根據系統可用性計算公式,假設每個月43200分鐘,99.9%的可用性就是43157分鐘, 99.8%的可用性就是43114分鐘,相當于每個月的宕機時間增加了43分鐘。

以上,可以驗證出來,CAP定理從理論上來講是正確的,CAP我們先看到這里,等會再接著說。

BASE理論

在分布式系統中,我們往往追求的是可用性,它的重要程序比一致性要高,那么如何實現高可用性呢? 前人已經給我們提出來了另外一個理論,就是BASE理論,它是用來對CAP定理進行進一步擴充的。BASE理論指的是:

Basically Available(基本可用)
Soft state(軟狀態)
Eventually consistent(最終一致性)

BASE理論是對CAP中的一致性和可用性進行一個權衡的結果,理論的核心思想就是:我們無法做到強一致,但每個應用都可以根據自身的業務特點,采用適當的方式來使系統達到最終一致性(Eventual consistency)。

有了以上理論之后,我們來看一下分布式事務的問題。

分布式事務的產生的原因

數據庫分庫分表

當數據庫單表一年產生的數據超過1000W,那么就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以后有空詳細說,簡單的說就是原來的一個數據庫變成了多個數據庫。這時候,如果一個操作既訪問01庫,又訪問02庫,而且要保證數據的一致性,那么就要用到分布式事務。

數據庫分布式事務產生的原因

應用SOA化

所謂的SOA化,就是業務的服務化。比如原來單機支撐了整個電商網站,現在對整個網站進行拆解,分離出了訂單中心、用戶中心、庫存中心。對于訂單中心,有專門的數據庫存儲訂單信息,用戶中心也有專門的數據庫存儲用戶信息,庫存中心也會有專門的數據庫存儲庫存信息。這時候如果要同時對訂單和庫存進行操作,那么就會涉及到訂單數據庫和庫存數據庫,為了保證數據一致性,就需要用到分布式事務。

數據庫分布式事務產生的原因

以上兩種情況表象不同,但是本質相同,都是因為要操作的數據庫變多了!

分布式事務解決方案

  • 基于XA協議的兩階段提交

XA是一個分布式事務協議,由Tuxedo提出。XA中大致分為兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由數據庫實現,比如Oracle、DB2這些商業數據庫都實現了XA接口,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA實現分布式事務的原理如下:

數據庫分布式事務產生的原因

總的來說,XA協議比較簡單,而且一旦商業數據庫實現了XA協議,使用分布式事務的成本也比較低。但是,XA也有致命的缺點,那就是性能不理想,特別是在交易下單鏈路,往往并發量很高,XA無法滿足高并發場景。XA目前在商業數據庫支持的比較理想,在mysql數據庫中支持的不太理想,mysql的XA實現,沒有記錄prepare階段日志,主備切換回導致主庫與備庫數據不一致。許多nosql也沒有支持XA,這讓XA的應用場景變得非常狹隘。

優缺點

優點: 盡量保證了數據的強一致,適合對數據強一致要求很高的關鍵領域。(其實也不能100%保證強一致)
缺點: 實現復雜,犧牲了可用性,對性能影響較大,不適合高并發高性能場景。

  • 消息事務+最終一致性

所謂的消息事務就是基于消息中間件的兩階段提交,本質上是對消息中間件的一種特殊利用,它是將本地事務和發消息放在了一個分布式事務里,保證要么本地操作成功成功并且對外發消息成功,要么兩者都失敗,開源的RocketMQ就支持這一特性,具體原理如下:

數據庫分布式事務產生的原因

1、A系統向消息中間件發送一條預備消息
2、消息中間件保存預備消息并返回成功
3、A執行本地事務
4、A發送提交消息給消息中間件

通過以上4步完成了一個消息事務。對于以上的4個步驟,每個步驟都可能產生錯誤,下面一一分析:

  • 步驟一出錯,則整個事務失敗,不會執行A的本地操作

  • 步驟二出錯,則整個事務失敗,不會執行A的本地操作

  • 步驟三出錯,這時候需要回滾預備消息,怎么回滾?答案是A系統實現一個消息中間件的回調接口,消息中間件會去不斷執行回調接口,檢查A事務執行是否執行成功,如果失敗則回滾預備消息

  • 步驟四出錯,這時候A的本地事務是成功的,那么消息中間件要回滾A嗎?答案是不需要,其實通過回調接口,消息中間件能夠檢查到A執行成功了,這時候其實不需要A發提交消息了,消息中間件可以自己對消息進行提交,從而完成整個消息事務

基于消息中間件的兩階段提交往往用在高并發場景下,將一個分布式事務拆成一個消息事務(A系統的本地操作+發消息)+B系統的本地操作,其中B系統的操作由消息驅動,只要消息事務成功,那么A操作一定成功,消息也一定發出來了,這時候B會收到消息去執行本地操作,如果本地操作失敗,消息會重投,直到B操作成功,這樣就變相地實現了A與B的分布式事務。原理如下:

數據庫分布式事務產生的原因

雖然上面的方案能夠完成A和B的操作,但是A和B并不是嚴格一致的,而是最終一致的,我們在這里犧牲了一致性,換來了性能的大幅度提升。當然,這種玩法也是有風險的,如果B一直執行不成功,那么一致性會被破壞,具體要不要玩,還是得看業務能夠承擔多少風險。

本地消息表(異步確保)

本地消息表這種實現方式應該是業界使用最多的,其核心思想是將分布式事務拆分成本地事務進行處理,這種思路是來源于ebay。我們可以從下面的流程圖中看出其中的一些細節:

數據庫分布式事務產生的原因

基本思路就是:

消息生產方,需要額外建一個消息表,并記錄消息發送狀態。消息表和業務數據要在一個事務里提交,也就是說他們要在一個數據庫里面。然后消息會經過MQ發送到消息的消費方。如果消息發送失敗,會進行重試發送。

消息消費方,需要處理這個消息,并完成自己的業務邏輯。此時如果本地事務處理成功,表明已經處理成功了,如果處理失敗,那么就會重試執行。如果是業務上面的失敗,可以給生產方發送一個業務補償消息,通知生產方進行回滾等操作。

生產方和消費方定時掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發送一遍。如果有靠譜的自動對賬補賬邏輯,這種方案還是非常實用的。

這種方案遵循BASE理論,采用的是最終一致性,筆者認為是這幾種方案里面比較適合實際業務場景的,即不會出現像2PC那樣復雜的實現(當調用鏈很長的時候,2PC的可用性是非常低的),也不會像TCC那樣可能出現確認或者回滾不了的情況。

優點: 一種非常經典的實現,避免了分布式事務,實現了最終一致性。

缺點: 消息表會耦合到業務系統中,如果沒有封裝好的解決方案,會有很多雜活需要處理。

MQ 事務消息

有一些第三方的MQ是支持事務消息的,比如RocketMQ,他們支持事務消息的方式也是類似于采用的二階段提交,但是市面上一些主流的MQ都是不支持事務消息的,比如 RabbitMQ 和 Kafka 都不支持。

以阿里的 RocketMQ 中間件為例,其思路大致為:

第一階段Prepared消息,會拿到消息的地址。
第二階段執行本地事務,第三階段通過第一階段拿到的地址去訪問消息,并修改狀態。

也就是說在業務方法內要想消息隊列提交兩次請求,一次發送消息和一次確認消息。如果確認消息發送失敗了RocketMQ會定期掃描消息集群中的事務消息,這時候發現了Prepared消息,它會向消息發送者確認,所以生產方需要實現一個check接口,RocketMQ會根據發送端設置的策略來決定是回滾還是繼續發送確認消息。這樣就保證了消息發送與本地事務同時成功或同時失敗。

數據庫分布式事務產生的原因

優點: 實現了最終一致性,不需要依賴本地數據庫事務。

缺點: 實現難度大,主流MQ不支持,沒有.NET客戶端,RocketMQ事務消息部分代碼也未開源。

  • TCC編程模式

所謂的TCC編程模式,也是兩階段提交的一個變種。TCC提供了一個編程框架,將整個業務邏輯分為三塊:Try、Confirm和Cancel三個操作。以在線下單為例,Try階段會去扣庫存,Confirm階段則是去更新訂單狀態,如果更新訂單失敗,則進入Cancel階段,會去恢復庫存。總之,TCC就是通過代碼人為實現了兩階段提交,不同的業務場景所寫的代碼都不一樣,復雜度也不一樣,因此,這種模式并不能很好地被復用。

TCC 采用的補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。它分為三個階段:

  1. Try 階段主要是對業務系統做檢測及資源預留

  2. Confirm 階段主要是對業務系統做確認提交,Try階段執行成功并開始執行 Confirm階段時,默認 Confirm階段是不會出錯的。即:只要Try成功,Confirm一定成功。

  3. Cancel 階段主要是在業務執行錯誤,需要回滾的狀態下執行的業務取消,預留資源釋放。

舉個例子,假入 Bob 要向 Smith 轉賬,思路大概是:
我們有一個本地方法,里面依次調用
1、首先在 Try 階段,要先調用遠程接口把 Smith 和 Bob 的錢給凍結起來。
2、在 Confirm 階段,執行遠程調用的轉賬的操作,轉賬成功進行解凍。
3、如果第2步執行成功,那么轉賬成功,如果第二步執行失敗,則調用遠程凍結接口對應的解凍方法 (Cancel)。

優缺點

優點: 跟2PC比起來,實現以及流程相對簡單了一些,但數據的一致性比2PC也要差一些
缺點: 缺點還是比較明顯的,在2,3步中都有可能失敗。TCC屬于應用層的一種補償方式,所以需要程序員在實現的時候多寫很多補償的代碼,在一些場景中,一些業務流程可能用TCC不太好定義及處理。

總結

分布式事務,本質上是對多個數據庫的事務進行統一控制,按照控制力度可以分為:不控制、部分控制和完全控制。不控制就是不引入分布式事務,部分控制就是各種變種的兩階段提交,包括上面提到的消息事務+最終一致性、TCC模式,而完全控制就是完全實現兩階段提交。部分控制的好處是并發量和性能很好,缺點是數據一致性減弱了,完全控制則是犧牲了性能,保障了一致性,具體用哪種方式,最終還是取決于業務場景。作為技術人員,一定不能忘了技術是為業務服務的,不要為了技術而技術,針對不同業務進行技術選型也是一種很重要的能力!

總結下解決方案:

一、結合MQ消息中間件實現的可靠消息最終一致性
二、TCC補償性事務解決方案
三、最大努力通知型方案

  • 第一種方案:可靠消息最終一致性,需要業務系統結合MQ消息中間件實現,在實現過程中需要保證消息的成功發送及成功消費。即需要通過業務系統控制MQ的消息狀態

數據庫分布式事務產生的原因

  • 第二種方案:TCC事務補償型,分為三個階段TRYING-CONFIRMING-CANCELING。每個階段做不同的處理。

    • TRYING 階段主要是對業務系統進行檢測及資源預留

    • CONFIRMING 階段是做業務提交,通過TRYING階段執行成功后,再執行該階段。默認如果TRYING階段執行成功,CONFIRMING就一定能成功。

    • CANCELING 階段是回對業務做回滾,在TRYING階段中,如果存在分支事務TRYING失敗,則需要調用CANCELING將已預留的資源進行釋放。
      以上所有的操作需要滿足冪等性,冪等性的實現方式可以是:
      1、通過唯一鍵值做處理,即每次調用的時候傳入唯一鍵值,通過唯一鍵值判斷業務是否被操作,如果已被操作,則不再重復操作
      2、通過狀態機處理,給業務數據設置狀態,通過業務狀態判斷是否需要重復執行

數據庫分布式事務產生的原因

  • 第三種方案:最大努力通知型(按規律進行通知,不保證數據一定能通知成功,但會提供可查詢操作接口進行核對)這種方案主要用在與第三方系統通訊時,比如:調用微信或支付寶支付后的支付結果通知。這種方案也是結合MQ進行實現,例如:通過MQ發送http請求,設置最大通知次數。達到通知次數后即不再通知。

數據庫分布式事務產生的原因

感謝各位的閱讀,以上就是“數據庫分布式事務產生的原因”的內容了,經過本文的學習后,相信大家對數據庫分布式事務產生的原因這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清徐县| 突泉县| 民权县| 崇文区| 富锦市| 历史| 阳江市| 沽源县| 攀枝花市| 兴化市| 柳州市| 民和| 冷水江市| 通辽市| 苍南县| 保康县| 铜川市| 股票| 杨浦区| 临安市| 淮北市| 高密市| 任丘市| 陇南市| 临城县| 抚松县| 阿克| 榆林市| 康保县| 宜兰市| 德昌县| 凌源市| 丰宁| 长顺县| 吉安市| 镇雄县| 清流县| 博兴县| 出国| 如东县| 云龙县|