什麼是分布式事務
分布式事務就是指事務的資源分別位於不同的分布式系統的不同節點之上的事務;
例如:信用卡還款,包含兩個操作
·從銀行賬戶扣錢
·恢復信用卡額度
·例子中兩個操作如果處於不同的資料庫,或者根本就是兩個微服務中的操作,想要保證資料的一致性,靠本地事務是解決不了的,這時候就需要分布式事務了。
事務屬性
原子性(atomicity)
事務中的所有操作,要麼都成功,要麼都失敗,不可能部分操作成功部分操作失敗。事務的操作或者完全應用到資料庫或者完全不影響資料庫。
拿信用卡還款來說,原子性就是銀行賬戶扣錢和信用卡額度恢復要麼都成功要麼都失敗。
一致性(consistency)
一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。
拿信用卡還款來說,一致性就是還款成功前和還款後銀行卡餘額加上信用額度是相等的。
隔離性(isolation)
事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
關於事務的隔離性資料庫提供了多種隔離級別,稍後會介紹。
永續性(durability)
在事務成功以後,該事務對資料庫所做的更改應當持久的儲存在資料庫中;
總結來說, 一致性是最基本的屬性,而原子性、隔離性、永續性是為了保證一致性而存在的。
事務的隔離級別
事務的隔離級別有什麼用呢?我們先看一下不考慮事務的隔離性會出現那些問題。
髒讀
時間軸為5的地方事務b就出現了髒讀
不可重複讀
事務b中兩次查詢結果並不一樣。不可重複讀和髒讀的區別是不可重複讀是讀取了另乙個事務提交的資料。
幻讀
mysql資料庫為我們提供的四種隔離級別:
分布式事務解決方案
tcc(try-confirm-cancel)
·tcc是由支付寶架構師提供的一種柔性解決分布式事務解決方案,主要包括三個步驟
·try: 完成業務檢查,預留必須的業務資源
·confirm: 真正的執行業務邏輯,不做任何業務檢查,只使用try階段預留的業務資源。所以,只要try執行成功,confirm必須能成功。confirm必須滿足冪等性,保證一次分布式事務只成功一次。
·cancel: 釋放try階段預留的業務資源。cancel也需要滿足冪等性
tcc自編碼的特性決定tcc資源管理器可以跨db、跨應用實現資源管理,將對不同的db訪問、不同的業務操作通過編碼方式轉 換乙個原子操作,解決了複雜業務場景下的事務問題;
在整個流程,我們主要需要關注的是cancel失敗和confirm失敗引起的資料不一致現象。
tcc模式要求從服務提供三個介面:try、confirm、cancel.而且confirm、cancel需要滿足冪等性。這將大大增加了開發難度。
事務自動補償
我們肯定都想和之前一樣編寫**,但是執行的時候程式會自動幫你保證事務的一致性。在tcc模式中就是程式自動幫你cancel,相當於框架幫你寫好了cancel,並在異常的時候執行cancel.這就是事務自動補償。
框架託管fmt(framework-managed transactions)模型
fmt是阿里gts(全域性事務服務)中的乙個可以實現自動補償事務的模型。
fmt 框架要求從業務服務只需要正常執行sql操作就可以了,框架會把業務的本地事務操作作為第一階段。在第一階段,框架會攔截使用者sql,解析sql語義,然後把業務sql涉及資料執行前後的狀態儲存下來,即資料快照,這個就相當於在邏輯上完成了資料庫內的undo和redo操作。在第二階段,如果這個事務要提交,那麼框架直接把快照資料刪除就可以了,因為第一階段的正常操作已經執行完成。如果該事務要回滾,那麼會先校驗髒寫,根據第一階段儲存的執行後的快照,檢查在本事務執行過程中,資料有沒有被其他操作修改,如果沒有,則把資料執行前的快照拿出來,完成回滾操作。
gts的限制
gts用於實現分布式環境下高效能事務一致性。可以與drds、rds、mysql、postgresql等資料來源,edas、dubbo及其他rpc框架,mq訊息佇列等中介軟體產品配合使用,輕鬆實現分布式資料庫事務、多庫事務、訊息事務、服務鏈路級事務及各種組合。
使用gts(全域性事務服務 - global transaction service)也有很大的限制的,比如下圖:
1.把乙個sql解析為抽象語法樹時,sql越複雜解析越耗時。所以複雜的sql使用fmt是非常不值得的,在複雜的業務邏輯面前事務的自動補償這個功能就顯得很雞肋了。
2.gts的隔離級別預設為讀未提交。當更新資料時很容易出現髒寫。這時候如果出現錯誤,cancel校驗髒寫就會出現錯誤恢復快照導致已經修改的資料被覆蓋。
3.gts提供的hint模式是針對阿里自研的drds.當你使用非drds時列如mysql時,使用了for update,這樣將會大大降低效能
4.不能使用聚合函式。讀未提交時聚合函式不一定準確(髒讀)。讀已提交時不支援聚合函式。
5.當插入/更新資料數量太多時儲存快照的消耗太大。而且快照是否持久化也是乙個問題
6.沒有解決幻讀問題
總結
綜上所述,事務的自動補償是沒有必要的。對於簡單的業務邏輯不需要,對於複雜的業務邏輯現在的事務自動補償達不到要求,想要效能好必須要做好髒讀、幻讀的準備,想要讀已提交必須要捨棄效能。所以目前階段還是使用tcc比較合適。
我們的分布式事務
這樣也是可以保證真正的讀已提交。
不聊馬斯洛,關於「需求」,我的16條經驗
1 正經需求的 有兩個 使用者和資料。其中資料也是使用者使用產品產生的,所以歸根結底一條結論 需求 於使用者。2 上述結論對天才無效。比如賈伯斯,人家是先把產品做出來,然後告訴使用者 你有這個需求!然後使用者竟然還普遍認同.3 有人會說,競品也是需求的重要 好吧,既然你這麼大言不慚的把抄競品擺在桌面...
沒有需求,我們仍然要測試
早期,我們確實遇到了 爛 專案 我們的專案有時候是在非常態下進行的,這個非常態是指專案在沒有文件化需求或需求以格式文件的形式描述,專案經理以口頭的形式描述系統需求,並要求開發人員在短期內完成 開發。接下來,開發人員在模稜兩可的狀態下彆扭的編寫 測試人員前期也無從介入,更可怕的是,積極性欠缺或責任心不...
這個需求,開發說我們不想做
我不是為了輸贏,我就是認真。羅永浩 產品工作中,最不想出現的工作狀態是產品沒有話語權。尤其是在開發說 我估計這個你也拍不了板 產品經理不得不找到老大。雖然帶著 經理 產品同學也是和其他開發同學一樣,並沒有高低階之分。只是說因為工作的流程是上下游關係,很多時候我們在乙個有 話語權 的網際網路開發團隊中...