分布式事務TCC補償機制

文章目錄

    • 概述
    • 工作流程
    • 優缺點
      • 優點:
      • 缺點:
    • 總結
    • Java 示例代碼

概述

TCC(Try-Confirm-Cancel)補償機制是一種事務處理模式,用于確保分布式系統中的操作成功完成或在失敗時進行補償。TCC將一個事務拆分為三個階段,即Try、Confirm和Cancel階段。在Try階段,業務系統嘗試執行事務并鎖定所需資源。如果Try階段成功,業務系統將進入Confirm階段并提交事務。如果Try階段失敗或出現其他異常情況,業務系統將回滾事務并釋放所有鎖定的資源。
TCC 采用了補償機制,其核心思想:針對每個操作,都要注冊一個與其對應確認和補償(撤銷)操作。
TCC是一種嘗試性執行,若所有參與結點都有事務執行的條件,那么直接執行事務。否則Cancel回滾操作。
對業務的操作入侵比較大,耦合性高,對于Try和Cancel可能需要重試
需要業務系統保證操作的冪等性,從業務角度的實現方案,因此可以跨數據庫、跨業務系統。
TCC 方案讓應用可以自定義數據庫操作粒度,降低了鎖沖突,可以提升性能。
但應用侵入性強,try、confirm、cancel 三個階段都需要業務邏輯實現。

工作流程

TCC(Try-Confirm-Cancel)是一種分布式事務解決方案,它通過明確的三個階段來保證分布式事務的一致性。TCC補償機制是TCC模式中用于處理事務失敗時的補償操作。
TCC模式的三個階段:
1.Try(嘗試)階段:在該階段,業務系統會嘗試預留資源并執行業務操作,但此時并未對資源進行真正的修改。如果所有的參與者都能夠成功預留資源,那么就可以進入下一個階段。如果任何一個參與者預留資源失敗,那么就需要進行補償操作。
2.Confirm(確認)階段:在該階段,業務系統會對之前預留的資源進行真正的修改,并確認事務的完成。如果所有的參與者都成功完成了資源的修改,那么事務就可以順利提交。如果任何一個參與者在這個階段失敗,那么就需要進行補償操作。
3.Cancel(取消)階段:在該階段,業務系統會對之前預留的資源進行釋放或者回滾操作,并且將之前的操作進行撤銷。如果所有的參與者都成功釋放了資源并完成了撤銷操作,那么事務就可以終止。如果任何一個參與者在這個階段失敗,那么同樣需要進行補償操作。
TCC補償機制的詳細過程如下:
1.當某個參與者在Try階段失敗時,需要執行相應的補償操作。補償操作的目的是撤銷或者回滾之前的操作,以保證數據的一致性。
2.補償操作應該是冪等的,即可以多次執行而不會產生額外的影響。這樣在補償過程中出現的網絡故障或者其他問題時,可以重試補償操作而不會導致數據不一致。
3.補償操作通常是和Confirm或Cancel階段相對應的,具體選擇是根據業務需求和場景來確定的。
4.補償操作應該盡可能地快速執行,以便盡早恢復到一致的狀態。
5. 可以通過定時任務或者人工干預來觸發和執行補償操作。
在這里插入圖片描述

優缺點

優點:

1.TCC補償機制的優點在于它提供了更高的可靠性和一致性。通過在事務執行過程中引入確認和取消機制,TCC確保了即使在出現錯誤或異常情況下,系統狀態仍然保持一致。此外,TCC還提供了更好的資源管理和鎖定控制,有助于提高系統的性能和效率。
2.可以靈活控制事務的邊界:TCC模式通過明確的三個階段來控制分布式事務的邊界,可以靈活地控制事務的粒度和范圍,減少事務的鎖競爭和沖突。
3.可以提高系統的并發性能:TCC模式可以將事務的過程拆分成多個階段,每個階段可以并發執行,從而提高系統的并發性能和吞吐量。
4.可以降低分布式事務的復雜度:TCC模式可以將分布式事務的復雜度降低到可控的范圍內,便于管理和維護。
5.可以保證數據的一致性:TCC補償機制可以保證在分布式事務失敗時,可以通過補償操作將數據恢復到一致的狀態,確保數據的正確性和完整性。

缺點:

1.實現復雜度較高:TCC模式相對于其他分布式事務解決方案,實現復雜度較高,需要對業務邏輯進行深入的理解和設計。
2.可能存在性能問題:TCC模式需要進行多次網絡通信和狀態轉換,可能會對系統的性能產生一定的影響,尤其是在高并發場景下。
3.事務邊界難以確定:TCC模式需要明確事務的邊界和階段,但在某些場景下,事務的邊界難以確定,容易出現事務處理失敗的情況。
4.補償操作復雜性高:TCC補償機制需要對每個參與者進行相應的補償操作,補償操作的復雜性取決于業務場景和實現方式,可能會帶來額外的開銷和復雜性。
5.然而,TCC也有其局限性。它需要更多的系統資源和處理時間,因為每個事務都需要經過Try、Confirm和Cancel三個階段。此外,它也需要更復雜的事務管理邏輯和編程模型,增加了開發人員的工作量和難度。
綜上所述,TCC補償機制作為TCC模式中保證分布式事務一致性的關鍵機制之一,具有其優點和缺點。在選擇分布式事務解決方案時,需要根據具體業務需求和場景來選擇最合適的方案。

總結

總的來說,TCC補償機制是一種用于確保分布式系統中事務一致性和可靠性的處理模式。它通過引入Try、Confirm和Cancel三個階段來提供更好的資源管理和鎖定控制,但也需要更多的系統資源和處理時間。在實施這種機制時,需要權衡其優缺點,并確保它適合特定應用的需求。
需要注意的是,TCC補償機制雖然可以處理分布式事務的一致性,但也帶來了一些額外的開銷和復雜性。在使用TCC模式時,需要仔細考慮業務場景和需求,并確保補償操作的正確性和可靠性。此外,還可以通過日志記錄、消息隊列等技術手段來增加系統的可靠性和容錯性。

Java 示例代碼

以下是一個簡單的 Java 示例代碼,演示了如何使用 TCC 模式和補償機制來處理分布式事務:

public interface OrderService {@Compensable(confirmMethod = "confirmPlaceOrder", cancelMethod = "cancelPlaceOrder")void tryPlaceOrder(Order order);void confirmPlaceOrder(Order order);void cancelPlaceOrder(Order order);
}public class OrderServiceImpl implements OrderService {@Autowiredprivate InventoryService inventoryService;@Autowiredprivate PaymentService paymentService;@Overridepublic void tryPlaceOrder(Order order) {// 嘗試預留資源并執行業務操作try {// 預留庫存資源inventoryService.reserveInventory(order);// 預留支付資源paymentService.reservePayment(order);} catch (Exception e) {// 預留資源失敗,拋出異常進行補償操作throw new CompensableTransactionException(e);}}@Overridepublic void confirmPlaceOrder(Order order) {// 確認事務完成,對之前預留的資源進行真正的修改inventoryService.updateInventory(order);paymentService.confirmPayment(order);}@Overridepublic void cancelPlaceOrder(Order order) {// 取消事務,并對之前預留的資源進行釋放或者回滾操作inventoryService.releaseInventory(order);paymentService.rollbackPayment(order);}
}public interface InventoryService {void reserveInventory(Order order);void updateInventory(Order order);void releaseInventory(Order order);
}public interface PaymentService {void reservePayment(Order order);void confirmPayment(Order order);void rollbackPayment(Order order);
}

在上面的示例中,OrderService 接口定義了 tryPlaceOrder、confirmPlaceOrder 和 cancelPlaceOrder 方法,并使用 @Compensable 注解標記 tryPlaceOrder 方法,指定了 confirmMethod 和 cancelMethod 的名稱。OrderServiceImpl 類實現了 OrderService 接口,通過 Autowired 注解注入了 InventoryService 和 PaymentService。在 tryPlaceOrder 方法中,調用了 inventoryService 和 paymentService 提供的方法進行資源的預留。如果預留失敗,則拋出 CompensableTransactionException 異常,觸發補償操作。在 confirmPlaceOrder 和 cancelPlaceOrder 方法中,分別對之前預留的資源進行真正的修改和釋放/回滾操作。InventoryService 和 PaymentService 接口分別定義了預留、確認和取消操作的方法,具體實現根據業務需求進行編寫。需要注意的是,以上示例代碼為簡化的示例,實際應用中還需要考慮事務的管理、冪等性處理、異常處理等方面的內容。具體實現要根據業務需求和框架選擇進行適當的調整和擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle的本地安裝和PUTTY+XMING遠程連接安裝和oracle翻頁功能

因為我也是一個初學者,所以可能有出錯的地方,如果有希望大家告訴我QQ:7343696.大家公共學習,進步。Oracle的安裝實驗的環境是vmware server 1.06 rehl 5.2最小安裝。oracle安裝的要求。1建議的內存1G(10g) 9i中是51…

Flutter之導url_launcher包提示 A dependency may only have one source.

1、問題 flutter項目在pubspec.yaml導入url_launcher包,然后點擊Pub get錯誤提示如下 F:\flutter_sdk\flutter\bin\flutter.bat --no-color pub get Running "flutter pub get" in flutter_1... Error on line 25, column 5 of …

這是我第一次使用代碼創建出一個窗口【python 游戲實戰 01】

前言 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新,包括別的語言以及實戰都將使用對話的方式進行教學,基礎編程語言教學適用于零基礎小白,之后實戰課程也將會逐步更新…

如何html中添加動態圖片,把動態圖片添加到視頻畫面中 視頻添加自定義動態圖片 視頻加動態logo...

我前面也編寫過關于視頻添加動態圖片的教程。前面所說的給是視頻添加的動態圖片是軟件中自帶的素材,雖然軟件中帶的動態圖片種類繁多,但是不外乎有些時候軟件中并沒有我們要用的動態圖片,這個時候我們就需要重外部添加啦,好多的軟…

ASP.NET Core 集成AAD認證在Docker中運行時要注意的一個問題

最近我在準備一個分享,就是基于.NET 6.0的云原生開發Microsoft 365應用,這個看起來很高大上的東東,其實我理解主要就是能把應用容器化,便于與環境無關地進行分發和部署。如果理解有誤,請大家糾正我。下面是其中的一個例…

QCon上海2015精彩回顧和總結

金秋十月,歷時三天的QCon上海2015于10月17日順利閉幕。本次大會邀請了100多位技術專家,為參會者奉上了100多場精彩的技術演講。\\本次QCon邀請了極客邦創始人兼CEO霍泰穩,攜程旅行網CTO、高級技術副總裁葉亞明,丁香園技術VP、EGO上…

ArcGIS中合并(merge)、聯合(union)、追加(append)、融合(dissolve)的用法區別與聯系

ArcGIS中,針對矢量數據拼接,有多個工具:合并(merge)、聯合(union)、追加(append)、融合(dissolve)等,本文以甘肅省1:100萬縣級數據詳細講解以上各個工具的用法、區別和注意事項。 有關合并(merge)、聯合(union)、追加(append)、融合(dissolve)等基礎操作內…

Singleton

問題:編寫一個Singleton類 簡單的方式 1 package cn.changb.singleton;2 3 /**4 * 簡單的方式:弊端是在并發執行時,14行處可能存在多個實例5 */6 public class SingletonDemo1 {7 private static SingletonDemo1 INSTANCE;8 9 private Singlet…

Flutter之運行提示Could not update files on device: Connection closed before full header was received

1 問題 運行flutter app提示錯誤如下 Performing hot restart... Syncing files to device MIX 3... Could not update files on device: HttpException: Connection closed before full header was received, uri http://127.0.0.1:65054/-tzvW6oGieQ/ Restarted applicati…

C++ 語法都不會怎么寫代碼? 03

作者簡介 作者名:1_bit 簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。系列教程將會…

自定義dialog彈窗html,自定義H5頁面dialog彈窗

彈窗一:樣式如下:HTML代碼://彈出窗通知取消確認//遮罩層$(.dialog .content).text(text);$(.dialog, .mark).removeClass(hide);}tipDialog("1111");$(".sure").click(function(){var type $(this).attr(type);if(typeb…

【三維激光掃描】第二章:國內外三維激光掃描設備簡介

地面三維激光掃描儀是地面激光掃描系統中最主要的硬件設備,近年來得到了快速發展,主要體現在品牌數量、性能指標、類型等方面的變化。本章主要介紹國內外主要設備的基本情況,對國內外研究現狀進行分析,最后指出目前存在的問題與未來的發展趨勢。 2.1 國外地面三維激光掃描儀…

Winform定時啟動

System.Timers.Timer t;int sum 0;int qian;int bai;int shi;int ge;public 測試定時啟動(){InitializeComponent();}//1.使用System.Timers.Timer//2.threadThread th;//定義線程private void 測試定時啟動_Load(object sender, EventArgs e){textBox1.Text "00.00&quo…

聊一聊容器暫停退出

1背景介紹 最近在寫 docker 相關教程,過程中發現容器暫停退出竟然有 docker kill、docker stop 和 docker pause 三種方式,今天就來分析下三者間的區別。2輔助指令 docker top - 查看容器進程docker event - 查看容器相關事件docker stats -…

初學者必看的文章:在VM12中安裝 RedHat RHEL7.2??系統的詳細步驟:看我如何操縱RHEL系統...

一、開始安裝 1)新建虛擬機 RHEL7.2 2)成功引導系統--開機出現此畫面 Install Red Hat EnterpriseLinux 7.2 安裝RHLE7.2 操作系統 Test this edia & install RedHat Enterpris…

Flutter之點擊按鈕打開百度鏈接

1 需求 點擊按鈕,打開百度鏈接 2 代碼實現 import package:flutter/material.dart; import package:url_launcher/url_launcher.dart;void main() {runApp(MyApp1()); }class MyApp1 extends StatelessWidget {overrideWidget build(BuildContext context) {return…

用計算機算出你喜歡吃你喜歡的人,Go for it七年級下學期1-12單元(期末復習)句子翻譯專練...

Go for it七年級下學期1-12單元(期末復習)句子翻譯專練Unit11.你的筆友是哪里人?Where is your _________ _______ _________? ( pe n , pal , from )2.他是澳大利亞人.He is ________ _________. (is, from, Australian)3.他住在哪里?Where __________ he________. (does ,…

因為我的名字特殊大家都是用異樣的眼光在看著我 04

作者簡介 作者名:1_bit 簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。系列教程將會…

【三維激光掃描】第三章:點云數據采集

第一節 野外掃描方案 為了獲取高精度完整的點云數據,工作過程-般包括項目計劃制訂、 外業數據采集和內業數據處理三個環節。《規程)中指出地面三維激光掃描總體工作流程應包括技術準備與技術設計、控制測量、數據采集、數據預處理、成果制作、質量控制與成果歸檔。本章首先閘…

undefined reference to 問題解決方法

最近在Linux下編程發現一個詭異的現象,就是在鏈接一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text0x13): undefined reference to func 關于undefined reference這樣的問題,大家其實經常會遇到,在此&#xff0c…