聊聊分布式事務

事務就是一個會話過程中,對上下文的影響是一致的,要么所有的更改都做了,要么所有的更變都撤銷掉。就要么生,要么死。沒有半死不死的中間不可預期狀態。

參考下薛定諤的貓。

事務是為了保障業務數據的完整性和準確性的。

分布式事務,常見的兩個處理辦法就是兩段式提交和補償。
兩段式提交典型的就是XA,有個事務協調器,告訴大家,來都準備好提交,大家回復,都準備好了,然后協調器告訴大家,一起提交,大家都提交了。
補償比較好理解,先處理業務,然后定時或者回調里,檢查狀態是不是一致的,如果不一致采用某個策略,強制狀態到某個結束狀態(一般是失敗狀態),然后就世界太平了。典型的就是沖正操作。


準備好了以后,如果沒有問題,收到提交,所有人都開始提交。
這個時候,比如對數據庫來說,有redo日志的。
如果某個數據庫這時候宕機了,那么它重啟的時候,先執行檢查,也會把上一次的這些操作都提交掉的。所以各個點的數據都是一致的。

問題 1:比如 一個業務要調用很多的服務都是寫操作,如果有其中一個寫的服務失敗了,怎么辦 ?假設 4個寫的吧,有2個寫失敗了 。

kimmking:淘寶之類的網站一般的做法是,如果4個都成功才算成功,那么這次提交時4個寫都設置成一個中間狀態,先容許不一致。然后4個執行完成了以后,回調或是定時任務里檢查這4個數據是不是一致的,如果一致就全部置為成功狀態,如果不一致就全部置為失敗。

復 雜的業務交互過程中,不建議使用強一致性的分布式事務。解決分布式事務的最好辦法就是不考慮分布式事務。就像剛說的問題一樣,把分布式的事務過程拆解成多 個中間狀態,中間狀態的東西不允許用戶直接操作,等狀態都一致成功,或者檢測到不一致的時候全部失敗掉。就解耦了這個強一致性的過程。

一般情況下準實時就成了。涉及到錢,有時候也可以這么搞。
淘寶幾s內完整一個訂單處理,不是什么問題吧。
銀行也不是全部都強一致性。也會扎差,也會沖正。
特別是涉及到多個系統的時候,我們比如買機票,支付完成以后,只支付完成狀態,然后返回給用戶了,我們過幾分鐘再刷新頁面,才會看到變成已出票,訂單完成狀態。
這個時候,如果我們要求所有處理,都是強一致性的,那么久完蛋了。頁面要死在那兒幾分鐘,才把這個事務處理完成,返回給用戶。

這樣就肯定涉及一個問題,支付了,但是最終出票沒出來。那就沒辦法,商量換票或退款。
淘寶的訂單改成出票失敗,給支付發消息通知退款。
慢的時候,有可能是手工出票,這時出一張票半小時都可能,如果要求都必須強一致性的話,所有處理線程都掛在哪兒,系統早就完蛋了。

解決分布式事務的最好辦法就是不考慮分布式事務。
拆分,大的業務流程,轉化成幾個小的業務流程,然后考慮最終一致性。

問題2:分布式事務是你們自己開發的,還是數據庫自帶的?
kimmking:
1、只要一個處理邏輯能保證要么成功,要么跟什么也沒做一樣,都算是事務。數據庫事務,MQ也有事務。
你自己甚至可以寫個程序生成兩個文件,要么都生成了,要么都刪掉不留痕跡,這也算是事務。
2、分布式事務這一塊有個XA規范,實現XA接口的事務,都可以加入到一個分布式事務中,被XA容器管理起來。
3、補償的辦法,需要具體情況具體分析,沒有一個各種場合都適用的框架。

轉載于:https://www.cnblogs.com/longshiyVip/p/5199443.html

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

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

相關文章

PLSQL DBMS_DDL.ANALYZE_OBJECT

http://space.itpub.net/11893231/viewspace-683241 本文轉自健哥的數據花園博客園博客,原文鏈接:http://www.cnblogs.com/gaojian/archive/2012/11/30/2795775.html,如需轉載請自行聯系原作者

【深度學習mmdetection錯誤】——mmdetection 運行報錯KeyError:‘ConvWS is already registered in conv layer‘

于是修改以下mmdetection的安裝文件: site-packages/mmdet-2.1.0unknown-py3.7-linux-x86_64.egg/mmdet/ops/conv_ws.py" 把 CONV_LAYERS.register_module(ConvWS) 修改為: CONV_LAYERS.register_module(nameConvWS, forceTrue)

ABB RAPID 在 Notepad++ 中語法高亮的實現

ABB RAPID 在 Notepad 中語法高亮的實現 分類: Misc2014-04-08 15:43 145人閱讀 評論(0) 收藏 舉報notepadNotepad 內置了一個稱為 UDL2.0 (User Defined Language) 的引擎,來實現用戶自定義語法高亮,使用它,可以定制自己的代碼語…

Redis服務器的啟動過程分析

轉載于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文將通過分析代碼來介紹Redis的啟動過程,通過查看Redis 的啟動腳本,得知Redis的啟動時從Redis.c的main方法開始的。Redis啟動可以分為以下幾個步驟…

MyEclipse運行時自動保存

今天第一次用MyEclipse,我發現我的代碼明明修改了,但運行結果發現總是修改前的代碼結果。后來發現,是代碼修改后必須保存,再點運行。這個功能明顯不合適,所以需要更改MyEclipse的配置。紅框是修改后的結果。 轉載于:ht…

PLSQL中INDEX BY TABLE 的 prior 和 next 操作學習

開始 --INDEX BY Table SET SERVEROUTPUT ON;DECLARETYPE enm_tab_type IS TABLE OFemp.ename%TYPEINDEX BY BINARY_INTEGER;enm_table enm_tab_type; BEGINenm_table(1):1001;enm_table(2):1002;enm_table(3):1003;enm_table(4):1004;enm_table(6):1006;dbms_output.put_line(…

【深度學習torch——error】——“xxx.pt is a zip archive(did you mean to use torch.jit.load()?)

這個問題是在進行權重文件加載進行預測的時候發生的,原因其實就是torch版本不對 我是用的工作站訓練使用的是torch1.7.0,然后用自己的電腦進行預測,就報錯了,原因就是自己的電腦是torch1.2.0版本的 因為在1.6版本以上的模型改變…

ABB 機器人 IRBP系列轉臺的一段代碼注釋

PROC IndexToStn1() //檢測變位機狀態 并設置要運行到的角度位置 并對不同的GetNextPartAdv返回值情況 進行處理 VAR bool bActive;VAR jointtarget jtCurrent; //聲明一個位置變量IF (NOT bInterchCalib1) CalibIntch1; ! reset inpo…

如何寫一個bootloader

聲明:本文為學習Codeproject文章的個人總結性文章, 原文:http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part 本人開發環境: 操作系統:Ubuntu 32位(64位的會有push…

定時執行某段程序

有時候我們需要每天 定時的 自動 去執行某段程序,那么這個功能如何實現呢? 經過百度,定時器就可以實現,總結如下: 我用控制臺寫了一個程序,用來在指定時間內 打印 “我執行了” 上面就是程序的運行結構&…

【error】深度優先搜索TypeError: unhashable type: ‘list‘

查網上的原因是: python字典的key不支持list類型和dict類型,需要轉換 但是我沒有使用到key,后來仔細查看發現是增加了一個裝飾器導致的,functions.lru.cache 把裝飾器注釋掉即可 # 利用深度搜索進行查找 lru_cache(None) def …

Okhttp 插入緩存攔截器 解析

我們在做網絡請求的時候,如果網絡請求過于頻繁而且請求的數據變動不大,或者基本沒有變動,這個時候如果沒有緩存功能,我們想一下 會浪費掉多少資源,一次請求刷新一次,去請求一次,不但會消耗用戶的…

淺談PROFINET IO通信的實時性

PROFINET由PROFIBUS國際組織(PROFIBUS International,PI)推出,是新一代基于工業以太網技術的自動化總線標準。作為一項戰略性的技術創新,PROFINET為自動化通信領域提 供了一個完整的網絡解決方案,囊括了諸如…

目標

學習計劃以及目標---------------------------------------------------------------------------------------------------------------------------------------------------------------- 正文 在上大學之前,可以說我完全是一個…

今日頭條核心技術“個性推薦算法”揭秘

今日頭條核心技術“個性推薦算法”揭秘 最近面試華興資本, 他們比較關注今日頭條算法的實現, 今天特轉載網上 今日頭條算法解密【IT168 評論】互聯網給用戶帶來了大量的信息,滿足了用戶在信息時代對信息的需求,也使得用戶在面對大…

PROFINET及其同步實時通訊分析

1 概述 PROFINET實時以太網是由Profibus International(PI)組織提出的基于以太網的自動化標準。從2004年4月開 始,PI與Interbus Club總線俱樂部聯手,負責合作開發與制定標準。PROFINET構成從I/O級直至協調治理級的基于組件的分…

【劍指offer15.二進制中1的個數】——位操作(左移右移等)

目錄 二進制的表示 二進制的位操作 應用: 劍指offer15.統計二進制中1的個數(多種方法,位右移操作、與操作等) 轉自:https://www.jianshu.com/p/3a31065a8e58 紅色為自己添加 我們都知道在計算機中所有的信息最終都…

java 異常處理機制(java 編程思想)

一、概念  “異常”這個詞有“我對此感到意外”的意思。問題出現了,你也許并不清楚該如何處理,但你的確知道不應該置之不理;你要停下來,看看是不是有別人或在別的地方,能夠處理這個問題。只是在當前的環境中還沒有足夠…

怎樣在CentOS 7.0上安裝和配置VNC服務器

這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教程也適合 RHEL 7 。在這個教程里,我們將學習什么是 VNC 以及怎樣在 CentOS 7 上安裝配置 VNC 服務器 。 我們都知道 這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教…

MOTOMAN機器人網絡控制的實現

最初程序員在Unix系統下使用Berkeley Socket編寫網絡程序,隨著Windows操作系統的普及,Microsoft、Sun等公司聯合開發了Winsock接口API。它實質上是一種進 程間通信,將之從單機環境擴展到網絡環境以適合于開發主機/客戶機通信程序。網絡通信的…