基本概念
ACID四個特性
- 原子性(Atomicity)指事務(wù)作為整體來執(zhí)行棚唆,要么全部執(zhí)行报亩,要么全不執(zhí)行套利;
- 一致性(Consistency)指事務(wù)應(yīng)確保數(shù)據(jù)從一個一致的狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致的狀態(tài);
- 隔離性(Isolation)指多個事務(wù)并發(fā)執(zhí)行時迎瞧,一個事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行间螟;
- 持久性(Durability)指已提交的事務(wù)修改數(shù)據(jù)會被持久保存吴旋。
剛性事務(wù) vs 柔性事務(wù)
如果將實(shí)現(xiàn)了 ACID 的事務(wù)要素的事務(wù)稱為剛性事務(wù)的話,那么基于 BASE 事務(wù)要素的事務(wù)則稱為柔性事務(wù)厢破。
BASE 是基本可用荣瑟、柔性狀態(tài)和最終一致性這三個要素的縮寫。
- 基本可用(Basically Available)保證分布式事務(wù)參與方不一定同時在線摩泪;
- 柔性狀態(tài)(Soft state)則允許系統(tǒng)狀態(tài)更新有一定的延時笆焰,這個延時對客戶來說不一定能夠察覺;
- 最終一致性(Eventually consistent)通常是通過消息傳遞的方式保證系統(tǒng)的最終一致性见坑。
本地事務(wù) vs 分布式事務(wù)
- 本地事務(wù) : 在單一數(shù)據(jù)節(jié)點(diǎn)中嚷掠,事務(wù)僅限于對單一數(shù)據(jù)庫資源的訪問控制。
幾乎所有的成熟的關(guān)系型數(shù)據(jù)庫都提供了對本地事務(wù)的原生支持荞驴。 - 分布式事務(wù):在基于微服務(wù)的分布式應(yīng)用環(huán)境下不皆,越來越多的應(yīng)用場景要求對多個服務(wù)的訪問及其相對應(yīng)的多個數(shù)據(jù)庫資源能納入到同一個事務(wù)當(dāng)中,分布式事務(wù)應(yīng)運(yùn)而生熊楼。
關(guān)系型數(shù)據(jù)庫雖然對本地事務(wù)提供了完美的 ACID 原生支持霹娄。 但在分布式的場景下,它卻成為系統(tǒng)性能的桎梏鲫骗。 如何讓數(shù)據(jù)庫在分布式場景下滿足 ACID 的特性或找尋相應(yīng)的替代方案犬耻,是分布式事務(wù)的重點(diǎn)工作。
本地事務(wù)
在不開啟任何分布式事務(wù)管理器的前提下挎峦,讓每個數(shù)據(jù)節(jié)點(diǎn)各自管理自己的事務(wù)。 它們之間沒有協(xié)調(diào)以及通信的能力合瓢,也并不互相知曉其他數(shù)據(jù)節(jié)點(diǎn)事務(wù)的成功與否坦胶。 本地事務(wù)在性能方面無任何損耗,但在強(qiáng)一致性以及最終一致性方面則力不從心晴楔。
兩階段提交
XA協(xié)議最早的分布式事務(wù)模型是由 X/Open 國際聯(lián)盟提出的 X/Open Distributed Transaction Processing (DTP) 模型顿苇,簡稱 XA 協(xié)議。
基于XA協(xié)議實(shí)現(xiàn)的分布式事務(wù)對業(yè)務(wù)侵入很小税弃。 它最大的優(yōu)勢就是對使用方透明纪岁,用戶可以像使用本地事務(wù)一樣使用基于XA協(xié)議的分布式事務(wù)。 XA協(xié)議能夠嚴(yán)格保障事務(wù) ACID 特性则果。
嚴(yán)格保障事務(wù) ACID 特性是一把雙刃劍幔翰。 事務(wù)執(zhí)行在過程中需要將所需資源全部鎖定漩氨,它更加適用于執(zhí)行時間確定的短事務(wù)。 對于長事務(wù)來說遗增,整個事務(wù)進(jìn)行期間對數(shù)據(jù)的獨(dú)占叫惊,將導(dǎo)致對熱點(diǎn)數(shù)據(jù)依賴的業(yè)務(wù)系統(tǒng)并發(fā)性能衰退明顯。 因此做修,在高并發(fā)的性能至上場景中霍狰,基于 XA 協(xié)議的分布式事務(wù)并不是最佳選擇。
柔性事務(wù)
在 ACID 事務(wù)中對隔離性的要求很高饰及,在事務(wù)執(zhí)行過程中蔗坯,必須將所有的資源鎖定。 柔性事務(wù)的理念則是通過業(yè)務(wù)邏輯將互斥鎖操作從資源層面上移至業(yè)務(wù)層面燎含。 通過放寬對強(qiáng)一致性要求宾濒,來換取系統(tǒng)吞吐量的提升。
區(qū)別與對比
基于 ACID 的強(qiáng)一致性事務(wù)和基于 BASE 的最終一致性事務(wù)都不是銀彈瘫镇,只有在最適合的場景中才能發(fā)揮它們的最大長處鼎兽。 可通過下表詳細(xì)對比它們之間的區(qū)別,以幫助開發(fā)者進(jìn)行技術(shù)選型铣除。
本地事務(wù) | 兩/三 階段事務(wù) | 柔性事務(wù) | |
---|---|---|---|
業(yè)務(wù)改造 | 無 | 無 | 需實(shí)現(xiàn)相關(guān)接口 |
一致性 | 不支持 | 支持 | 最終一致 |
隔離性 | 不支持 | 支持 | 業(yè)務(wù)方保證 |
并發(fā)性能 | 無影響 | 嚴(yán)重衰退 | 略微衰退 |
適合場景 | 業(yè)務(wù)方處理不一致 | 短事務(wù) & 低并發(fā) | 長事務(wù) & 高并發(fā) |
主流解決方案介紹
柔性事務(wù)在 2008 年發(fā)表的一篇論文中被最早提到谚咬, 它提倡采用最終一致性放寬對強(qiáng)一致性的要求,以達(dá)到事務(wù)處理并發(fā)度的提升尚粘。
TCC 和 Saga 是兩種常見實(shí)現(xiàn)方案择卦。 他們主張開發(fā)者自行實(shí)現(xiàn)對數(shù)據(jù)庫的反向操作,來達(dá)到數(shù)據(jù)在回滾時仍能夠保證最終一致性郎嫁。
[SEATA] (https://github.com/seata/seata) 實(shí)現(xiàn)了 SQL 反向操作的自動生成秉继,可以使柔性事務(wù)不再必須由開發(fā)者介入才能使用。
Apache ShardingSphere 集成了 SEATA 作為柔性事務(wù)的使用方案泽铛。
(內(nèi)容待續(xù))