最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python完成一個(gè)分布式事務(wù)TCC

 更新時(shí)間:2021年10月25日 09:10:14   作者:yedf  
這篇文章主要介紹了用python完成一個(gè)分布式事務(wù)TCC,文章里我們介紹了TCC的理論知識(shí),也通過(guò)一個(gè)例子,完整給出了編寫一個(gè)TCC事務(wù)的過(guò)程,涵蓋了正常成功完成,以及成功回滾的情況,需要的朋友可以參考一下文章的具體內(nèi)容

前言:

什么是分布式事務(wù)?銀行跨行轉(zhuǎn)賬業(yè)務(wù)是一個(gè)典型分布式事務(wù)場(chǎng)景,假設(shè)A需要跨行轉(zhuǎn)賬給B,那么就涉及兩個(gè)銀行的數(shù)據(jù),無(wú)法通過(guò)一個(gè)數(shù)據(jù)庫(kù)的本地事務(wù)保證轉(zhuǎn)賬的ACID,只能夠通過(guò)分布式事務(wù)來(lái)解決。

分布式事務(wù)就是指事務(wù)的發(fā)起者、資源及資源管理器和事務(wù)協(xié)調(diào)者分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)之上。在上述轉(zhuǎn)賬的業(yè)務(wù)中,用戶A-100操作和用戶B+100操作不是位于同一個(gè)節(jié)點(diǎn)上。本質(zhì)上來(lái)說(shuō),分布式事務(wù)就是為了保證在分布式場(chǎng)景下,數(shù)據(jù)操作的正確執(zhí)行。

什么是TCC分布式事務(wù),TCCTryConfirm、Cancel三個(gè)詞語(yǔ)的縮寫,最早是由 Pat Helland 于 2007 年發(fā)表的一篇名為《Life beyond Distributed Transactions:an Apostate's Opinion》的論文提出。

1、TCC組成

TCC分為3個(gè)階段

  • Try 階段:嘗試執(zhí)行,完成所有業(yè)務(wù)檢查(一致性), 預(yù)留必須業(yè)務(wù)資源(準(zhǔn)隔離性)
  • Confirm 階段:如果所有分支的Try都成功了,則走到Confirm階段。Confirm真正執(zhí)行業(yè)務(wù),不作任何業(yè)務(wù)檢查,只使用 Try 階段預(yù)留的業(yè)務(wù)資源
  • Cancel 階段:如果所有分支的Try有一個(gè)失敗了,則走到Cancel階段。Cancel釋放 Try 階段預(yù)留的業(yè)務(wù)資源。

TCC分布式事務(wù)里,有3個(gè)角色,與經(jīng)典的XA分布式事務(wù)一樣:

  • AP/應(yīng)用程序,發(fā)起全局事務(wù),定義全局事務(wù)包含哪些事務(wù)分支
  • RM/資源管理器,負(fù)責(zé)分支事務(wù)各項(xiàng)資源的管理
  • TM/事務(wù)管理器,負(fù)責(zé)協(xié)調(diào)全局事務(wù)的正確執(zhí)行,包括ConfirmCancel的執(zhí)行,并處理網(wǎng)絡(luò)異常

如果我們要進(jìn)行一個(gè)類似于銀行跨行轉(zhuǎn)賬的業(yè)務(wù),轉(zhuǎn)出(TransOut)和轉(zhuǎn)入(TransIn)分別在不同的微服務(wù)里,

一個(gè)成功完成的TCC事務(wù)典型的時(shí)序圖如下:

2、TCC實(shí)踐

對(duì)于前面的跨行轉(zhuǎn)賬操作,最簡(jiǎn)單的做法是,在Try階段調(diào)整余額,在Cancel階段反向調(diào)整余額,Confirm階段則空操作。這么做帶來(lái)的問(wèn)題是,如果A扣款成功,金額轉(zhuǎn)入B失敗,最后回滾,把A的余額調(diào)整為初始值。在這個(gè)過(guò)程中如果A發(fā)現(xiàn)自己的余額被扣減了,但是收款方B遲遲沒(méi)有收到余額,那么會(huì)對(duì)A造成困擾。

更好的做法是,Try階段凍結(jié)A轉(zhuǎn)賬的金額,Confirm進(jìn)行實(shí)際的扣款,Cancel進(jìn)行資金解凍,這樣用戶在任何一個(gè)階段,看到的數(shù)據(jù)都是清晰明了的。

下面我們進(jìn)行一個(gè)TCC事務(wù)的具體開發(fā)

目前可用于TCC的開源框架,主要為Java語(yǔ)言,其中以seata為代表。我們的例子采用Python語(yǔ)言,使用的分布式事務(wù)框架為 https://github.com/yedf/dtm ,它對(duì)分布式事務(wù)的支持非常優(yōu)雅。下面來(lái)詳細(xì)講解TCC的組成

我們首先創(chuàng)建兩張表,一張是用戶余額表,一張是凍結(jié)資金表,建表語(yǔ)句如下:

CREATE TABLE dtm_busi.`user_account` (
  `id` int(11) AUTO_INCREMENT PRIMARY KEY,
  `user_id` int(11) not NULL UNIQUE ,
  `balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  `create_time` datetime DEFAULT now(),
  `update_time` datetime DEFAULT now()
);

CREATE TABLE dtm_busi.`user_account_trading` (
  `id` int(11) AUTO_INCREMENT PRIMARY KEY,
  `user_id` int(11) not NULL UNIQUE ,
  `trading_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
  `create_time` datetime DEFAULT now(),
  `update_time` datetime DEFAULT now()
);


trading表中,trading_balance記錄正在交易的金額。

我們先編寫核心代碼,凍結(jié)/解凍資金操作,會(huì)檢查約束balance+trading_balance >= 0,如果約束不成立,執(zhí)行失敗

def tcc_adjust_trading(cursor, uid, amount):
  affected = utils.sqlexec(cursor, "update dtm_busi.user_account_trading set trading_balance=trading_balance + %d where user_id=%d and trading_balance + %d + (select balance from dtm_busi.user_account where id=%d) >= 0" % (amount, uid, amount, uid))
  if affected == 0:
    raise Exception("update error, maybe balance not enough")


然后是調(diào)整余額

def tcc_adjust_balance(cursor, uid, amount):
  utils.sqlexec(cursor, "update dtm_busi.user_account_trading set trading_balance = trading_balance+ %d where user_id=%d" %( -amount, uid))
  utils.sqlexec(cursor, "update dtm_busi.user_account set balance=balance+%d where user_id=%d" %(amount, uid))


下面我們來(lái)編寫具體的Try/Confirm/Cancel的處理函數(shù)

@app.post("/api/TransOutTry")
def trans_out_try():
  # 事務(wù)以及異常處理
  tcc_adjust_trading(c, out_uid, -30)
  return {"dtm_result": "SUCCESS"}

@app.post("/api/TransOutConfirm")
def trans_out_confirm():
  # 事務(wù)以及異常處理
  tcc_adjust_balance(c, out_uid, -30)
  return {"dtm_result": "SUCCESS"}

@app.post("/api/TransOutCancel")
def trans_out_cancel():
  # 事務(wù)以及異常處理
  tcc_adjust_trading(c, out_uid, 30)
  return {"dtm_result": "SUCCESS"}

@app.post("/api/TransInTry")
def trans_in_try():
  # 事務(wù)以及異常處理
  tcc_adjust_trading(c, in_uid, 30)
  return {"dtm_result": "SUCCESS"}

@app.post("/api/TransInConfirm")
def trans_in_confirm():
  # 事務(wù)以及異常處理
  tcc_adjust_balance(c, in_uid, 30)
  return {"dtm_result": "SUCCESS"}

@app.post("/api/TransInCancel")
def trans_in_cancel():
  # 事務(wù)以及異常處理
  tcc_adjust_trading(c, in_uid, -30)
  return {"dtm_result": "SUCCESS"}

到此各個(gè)子事務(wù)的處理函數(shù)已經(jīng)OK了,然后是開啟TCC事務(wù),進(jìn)行分支調(diào)用

@app.get("/api/fireTcc")
def fire_tcc():
    # 發(fā)起tcc事務(wù)
    gid = tcc.tcc_global_transaction(dtm, utils.gen_gid(dtm), tcc_trans)
    return {"gid": gid}

# tcc事務(wù)的具體處理
def tcc_trans(t):
    req = {"amount": 30} # 業(yè)務(wù)請(qǐng)求的負(fù)荷
    # 調(diào)用轉(zhuǎn)出服務(wù)的Try|Confirm|Cancel
    t.call_branch(req, svc + "/TransOutTry", svc + "/TransOutConfirm", svc + "/TransOutCancel")
    # 調(diào)用轉(zhuǎn)入服務(wù)的Try|Confirm|Cancel
    t.call_branch(req, svc + "/TransInTry", svc + "/TransInConfirm", svc + "/TransInCancel")

至此,一個(gè)完整的TCC分布式事務(wù)編寫完成。

如果您想要完整運(yùn)行一個(gè)成功的示例,那么按照dtmcli-py-sample項(xiàng)目的說(shuō)明tcc的例子即可

3、TCC的回滾

假如銀行將金額準(zhǔn)備轉(zhuǎn)入用戶2時(shí),發(fā)現(xiàn)用戶2的賬戶異常,返回失敗,會(huì)怎么樣?我們修改代碼,模擬這種情況:

@app.post("/api/TransInTry")
def trans_in_try():
  # 事務(wù)以及異常處理
  tcc_adjust_trading(c, in_uid, 30)
  return {"dtm_result": "FAILURE"}


這是事務(wù)失敗交互的時(shí)序圖:

這個(gè)跟成功的TCC差別就在于,當(dāng)某個(gè)子事務(wù)返回失敗后,后續(xù)就回滾全局事務(wù),調(diào)用各個(gè)子事務(wù)的Cancel操作,保證全局事務(wù)全部回滾。

4、TCC網(wǎng)絡(luò)異常

TCC在整個(gè)全局事務(wù)的過(guò)程中,可能發(fā)生各類網(wǎng)絡(luò)異常情況,典型的是空回滾、冪等、懸掛,由于TCC的異常情況,和SAGA、可靠消息等事務(wù)模式有相近的地方,因此我們把所有異常的解決方案統(tǒng)統(tǒng)放在這篇文章 分布式事務(wù)最經(jīng)典的七種解決方案 的異常處理章節(jié)進(jìn)行講解

5、小結(jié)

在這篇文章里,我們介紹了TCC的理論知識(shí),也通過(guò)一個(gè)例子,完整給出了編寫一個(gè)TCC事務(wù)的過(guò)程,涵蓋了正常成功完成,以及成功回滾的情況。相信讀者通過(guò)這邊文章,對(duì)TCC已經(jīng)有了深入的理解。

關(guān)于分布式事務(wù)更多更全面的知識(shí),請(qǐng)參考 關(guān)于MySQL與Golan分布式事務(wù)經(jīng)典的七種解決方案

到此這篇關(guān)于用python完成一個(gè)分布式事務(wù)TCC的文章就介紹到這了,更多相關(guān)用python完成一個(gè)分布式事務(wù)TCC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python pandas求方差和標(biāo)準(zhǔn)差的方法實(shí)例

    Python pandas求方差和標(biāo)準(zhǔn)差的方法實(shí)例

    標(biāo)準(zhǔn)差(或方差),分為 總體標(biāo)準(zhǔn)差(方差)和 樣本標(biāo)準(zhǔn)差(方差),下面這篇文章主要給大家介紹了關(guān)于pandas求方差和標(biāo)準(zhǔn)差的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python實(shí)現(xiàn)簡(jiǎn)易凱撒密碼的示例代碼

    Python實(shí)現(xiàn)簡(jiǎn)易凱撒密碼的示例代碼

    密碼的使用最早可以追溯到古羅馬時(shí)期,《高盧戰(zhàn)記》有描述愷撒曾經(jīng)使用密碼來(lái)傳遞信息,即所謂的“愷撒密碼”。本文將利用Python實(shí)現(xiàn)簡(jiǎn)易的凱撒密碼,感興趣的可以了解一下
    2022-09-09
  • 基于Python預(yù)測(cè)一下世界杯最后贏家

    基于Python預(yù)測(cè)一下世界杯最后贏家

    四年一度的世界杯已經(jīng)開始了,對(duì)于不少熱愛(ài)足球運(yùn)動(dòng)的球迷來(lái)說(shuō),這可是十分難得的盛宴。今天小編就通過(guò)Python數(shù)據(jù)分析以及機(jī)器學(xué)習(xí)等方式來(lái)預(yù)測(cè)一下誰(shuí)能獲得最后的冠軍,感興趣的可以了解一下
    2022-11-11
  • python內(nèi)置函數(shù):lambda、map、filter簡(jiǎn)單介紹

    python內(nèi)置函數(shù):lambda、map、filter簡(jiǎn)單介紹

    Python 內(nèi)置了一些比較特殊且實(shí)用的函數(shù),使用這些能使你的代碼簡(jiǎn)潔而易讀。下面對(duì)python內(nèi)置函數(shù):lambda、map、filter簡(jiǎn)單介紹下,需要的朋友參考下吧
    2017-11-11
  • Python解析xml中dom元素的方法

    Python解析xml中dom元素的方法

    這篇文章主要介紹了Python解析xml中dom元素的方法,實(shí)例分析了Python操作XML中元素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 詳解讓Python性能起飛的15個(gè)技巧

    詳解讓Python性能起飛的15個(gè)技巧

    Python?一直以來(lái)被大家所詬病的一點(diǎn)就是執(zhí)行速度慢,但不可否認(rèn)的是?Python?依然是我們學(xué)習(xí)和工作中的一大利器。本文總結(jié)了15個(gè)tips有助于提升?Python?執(zhí)行速度、優(yōu)化性能,需要的可以參考一下
    2022-02-02
  • 利用Tkinter(python3.6)實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器

    利用Tkinter(python3.6)實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器

    這篇文章主要給大家介紹了關(guān)于利用Tkinter(python3.6)實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 如何利用python寫GUI及生成.exe可執(zhí)行文件

    如何利用python寫GUI及生成.exe可執(zhí)行文件

    工作中需要開發(fā)一個(gè)小工具,簡(jiǎn)單的UI界面可以很好的提高工具的實(shí)用性,由此開啟了我的第一次GUI開發(fā)之旅,這篇文章主要給大家介紹了關(guān)于如何利用python寫GUI及生成.exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Python與人工神經(jīng)網(wǎng)絡(luò):使用神經(jīng)網(wǎng)絡(luò)識(shí)別手寫圖像介紹

    Python與人工神經(jīng)網(wǎng)絡(luò):使用神經(jīng)網(wǎng)絡(luò)識(shí)別手寫圖像介紹

    文章主要介紹什么是神經(jīng)網(wǎng)絡(luò),感知機(jī)的概念和模型,以及新一代的S曲線神經(jīng)元系統(tǒng)等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié)

    Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié)

    本文主要介紹了Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03

最新評(píng)論

昌黎县| 武清区| 颍上县| 东至县| 凤翔县| 锡林郭勒盟| 中卫市| 平原县| 奉新县| 额敏县| 大名县| 额尔古纳市| 岫岩| 句容市| 桐城市| 绵阳市| 胶州市| 定结县| 敦煌市| 买车| 尼勒克县| 鄂托克前旗| 兴化市| 东台市| 陆河县| 遂平县| 乌什县| 如皋市| 康乐县| 广宁县| 崇义县| 游戏| 杭锦后旗| 南和县| 县级市| 新丰县| 静乐县| 乌鲁木齐县| 鹰潭市| 巴东县| 东方市|