SpringCloud--分布式事務(wù)

1.什么是事務(wù)

事務(wù)(TRANSACTION)是作為單個(gè)邏輯工作單元執(zhí)行的一系列SQL操作,這些操作作為一個(gè)整體一起向系統(tǒng)提交春畔,要么都執(zhí)行仗谆、要么都不執(zhí)行碗啄。

2.事務(wù)的ACID 特性

2.1.原子性

即不可分割性笔宿,事務(wù)要么全部被執(zhí)行犁钟,要么就全部不被執(zhí)行。

2. 2. 一致性或可串性

事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另一種 正確狀態(tài)

2.3. 隔離性

在事務(wù)正確提交之前泼橘,不允許把該事務(wù)對(duì)數(shù)據(jù)的任何改變提供 給任何其他事務(wù)

2.4. 持久性

事務(wù)正確提交后涝动,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中,即使在事務(wù) 提交后有了其它故障炬灭,事務(wù)的處理結(jié)果也會(huì)得到保存

3.事務(wù)并發(fā)帶來(lái)的問(wèn)題

在典型的應(yīng)用程序中,多個(gè)事務(wù)并發(fā)運(yùn)行醋粟,經(jīng)常會(huì)操作相同的數(shù)據(jù)來(lái) 完成各自的任務(wù)(多個(gè)用戶對(duì)同一 數(shù)據(jù)進(jìn)行操作).并發(fā)雖然是必須的, 但可能會(huì)導(dǎo)致以下的問(wèn)題。

3.1. 臟讀 (Dirty read)

當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù)并且對(duì)數(shù)據(jù)進(jìn)行了修改, 而這種修改還沒有提交到數(shù)據(jù)庫(kù)中,這時(shí)另外一個(gè)事務(wù)也訪問(wèn)了這 個(gè)數(shù) 據(jù),然后使用了這個(gè)數(shù)據(jù).因?yàn)檫@個(gè)數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另 外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是“臟數(shù)據(jù)”,依據(jù)“臟數(shù)據(jù)”所做的操作可能 是不正確的。

3.2.丟失修改(Lost to modify)

指在一個(gè)事務(wù)讀取一個(gè)數(shù)據(jù)時(shí)米愿,另外一 個(gè)事務(wù)也訪問(wèn)了該數(shù)據(jù)厦凤,那么在第一個(gè)事務(wù)中修改了這個(gè)數(shù)據(jù)后,第 二 個(gè)事務(wù)也修改了這個(gè)數(shù)據(jù)吗货。這樣第一個(gè)事務(wù)內(nèi)的修改結(jié)果就被丟失泳唠,因 此稱為丟失修改狈网。

3.3. 不可重復(fù)讀(Unrepeatableread)

指在一個(gè)事務(wù)內(nèi)多次讀同一數(shù)據(jù)宙搬。 在這個(gè)事務(wù)還沒有結(jié)束時(shí),另一個(gè)事務(wù)也訪問(wèn)該數(shù)據(jù)拓哺。那么勇垛,在第 一個(gè) 事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改導(dǎo)致第一個(gè)事務(wù)兩次 讀取的數(shù)據(jù)可能不太一樣士鸥。這就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是 不一樣的情況闲孤,因此稱為不可重復(fù)讀。

3.4.幻讀(Phantom read)

幻讀與不可重復(fù)讀類似烤礁。它發(fā)生在一個(gè)事務(wù)

( T1)讀取了幾行數(shù)據(jù)讼积,接著另一個(gè)并發(fā)事務(wù)( T2)插入了一些數(shù)據(jù) 時(shí)。在隨后的查詢中脚仔,第一個(gè)事務(wù)( T1)就會(huì)發(fā)現(xiàn)多了一些原本不存在 的記錄勤众,就好像發(fā)生了幻覺一樣,所以稱為幻讀鲤脏。

3.5. 不可重復(fù)讀和幻讀區(qū)別

不可重復(fù)讀的重點(diǎn)是修改们颜,比如多次讀取一 條記錄發(fā)現(xiàn)其中某些列的值被修改,幻讀的重點(diǎn)在于新增或者刪除比如 多次讀取一條記錄發(fā)現(xiàn)記錄 增多或減少了

4.事務(wù)的隔離級(jí)別

4.1.READ-UNCOMMITTED( 讀取未提交 )

最低的隔離級(jí)別猎醇,允許讀取尚未提交 的數(shù)據(jù)變更窥突,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀硫嘶。

4.2.READ-COMMITTED( 讀取已提交 )

允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)阻问,可 以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生沦疾。

4.3.REPEATABLE-READ( 可重復(fù)讀 )

對(duì)同一字段的多次讀取結(jié)果都是一致 的称近,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀曹鸠,但幻 讀仍有可能發(fā)生煌茬。

4.4.SERIALIZABLE( 可串行化 )

最高的隔離級(jí)別,完全服從 ACID 的隔離級(jí) 別彻桃。所有的事務(wù)依次逐個(gè)執(zhí)行坛善,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就 是說(shuō),該級(jí)別可以防止臟讀眠屎、不可重復(fù)讀以及幻讀剔交。

5.什么是分布式事務(wù)

分布式事務(wù)就是指事務(wù)的參與者、支持事務(wù)的服務(wù)器改衩、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上岖常。以上是百度百科的解釋,簡(jiǎn)單的說(shuō)葫督,就是一次大的操作由不同的小操作組成竭鞍,這些小的操作分布在不同的服務(wù)器上,且屬于不同的應(yīng)用橄镜,分布式事務(wù)需要保證這些小操作要么全部成功偎快,要么全部失敗。本質(zhì)上來(lái)說(shuō)洽胶,分布式事務(wù)就是為了保證不同數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性

6.為什么使用分布式事務(wù)

image.png
image.png

7.如何解決分布式事務(wù)的問(wèn)題

使用消息中間件

手寫代碼解決分布式事務(wù)

使用第三方組件--->Seata阿里巴巴的產(chǎn)品

8.seata

Seata部署指南

8.1.什么是seata

Seata 是一款開源的分布式事務(wù)解決方案晒夹,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT姊氓、TCC丐怯、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案翔横。

image.png

8.2.Seata的執(zhí)行流程

1.A服務(wù)【訂單微服務(wù)】的TM[事務(wù)發(fā)起者]向TC[seata服務(wù)端]申請(qǐng)開啟一個(gè)全局事務(wù)读跷,TC就會(huì)創(chuàng)建一個(gè)全局事務(wù)并返回一個(gè)唯一的XID

2.A服務(wù)開始遠(yuǎn)程調(diào)用B服務(wù)【賬戶微服務(wù)】,此時(shí)XID會(huì)在微服務(wù)的調(diào)用鏈上傳播

3.B服務(wù)的RM向TC注冊(cè)分支事務(wù)棕孙,并將其納入XID對(duì)應(yīng)的全局事務(wù)的管轄

4.B服務(wù)執(zhí)行分支事務(wù)舔亭,向數(shù)據(jù)庫(kù)做操作

5.全局事務(wù)調(diào)用鏈處理完畢,TM根據(jù)有無(wú)異常向TC發(fā)起全局事務(wù)的提交或者回滾

6.TC協(xié)調(diào)其管轄之下的所有分支事務(wù)蟀俊, 決定是否回滾

image.png
TM:事務(wù)發(fā)起者【在哪個(gè)方法上添加了全局事務(wù)注解的】
TC : 事務(wù)管理器【seata的服務(wù)端】
RM: 每個(gè)操作數(shù)據(jù)庫(kù)的微服務(wù)
TID: 全局事務(wù)id
TM和RM都屬于微服務(wù)代碼
TC: seata服務(wù)器钦铺。

9.搭建seata服務(wù)器

9.1.查看版本--版本要對(duì)應(yīng)

image.png

9.2.下載seata1.3.0

因?yàn)槲襰pringcloud使用的是2.2.3

image.png
image.png

找對(duì)應(yīng)的版本

image.png

9.3.解壓

image.png

9.4.修改conf/file.conf

seata默認(rèn)保存到本地中,以后會(huì)有seata集群,得讓seata信息可以共享,我們應(yīng)該修改它的保存位置:

image.png
image.png

serverTimezone這個(gè)是正確的

9.5.拉取mysql的驅(qū)動(dòng)

image.png
image.png

9.6.創(chuàng)建數(shù)據(jù)庫(kù)并導(dǎo)入表結(jié)構(gòu)

image.png

seata部署指南中
image.png
image.png
image.png
image.png
image.png

可以直接下載將scipt放到senta中

image.png
image.png
image.png

9.7.指定seata的注冊(cè)中心地址和配置中心的內(nèi)容

image.png
image.png
image.png
image.png

9.8.需要把哪些配置項(xiàng)放入nacos配置中心

image.png

9.8.1.修改儲(chǔ)存方式

image.png
image.png

9.8.2.修改自己的MySQL

image.png

注意里面的serverTimezone這個(gè)是正確的

9.8.3.修改組名

image.png
image.png

9.9.使用nacos/nacos-fonfig.sh 把配置信息放入nacos配置中心

image.png

使用git打開nacos-config.sh

image.png

9.10.指定nacos配置中心的地址

image.png

9.11.訪問(wèn)一下自己nacos

image.png

10.配置微服務(wù)客戶端

10.1.在每個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建unlog表

image.png
image.png
image.png

10.2.在每個(gè)微服務(wù)中添加seata依賴

<!--seata 一定要保證和seata服務(wù)的版本匹配-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

10.2.1.查看一下自己的版本

image.png

10.3.修改每個(gè)微服務(wù)的配置文件

#指定seata分組名稱--組名必須和config.txt文件中的分組名字一致
 alibaba:
 seata:
 tx-service-group: guangzhou
#指定seata服務(wù)器在nacos的注冊(cè)中心的地址
seata:
 registry:
    #類型是nacos
 type: nacos
    #指定nacos的地址
 nacos:
 server-addr: localhost:8848
      #指定nacos的賬號(hào)和密碼
 username: nacos
 password: nacos
      #組名--默認(rèn)是SEATA_GROUP--可以不寫
 group: DEFAULT_GROUP
      #指定seata服務(wù)器在注冊(cè)中心的服務(wù)名稱--默認(rèn)seata-server
 application: seata-storage
  #指定配置的類型--配置中心
 config:
 type: nacos
 nacos:
 server-addr: localhost:8848
 username: nacos
 password: nacos
 group: SEATA_GROUP

10.4.設(shè)置事務(wù)發(fā)起者

image.png

10.5.啟動(dòng)seata

image.png

10.6.測(cè)試

image.png
image.png
image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肢预,一起剝皮案震驚了整個(gè)濱河市矛洞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烫映,老刑警劉巖沼本,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锭沟,居然都是意外死亡抽兆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門族淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辫红,“玉大人凭涂,你說(shuō)我怎么就攤上這事√蓿” “怎么了切油?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)名惩。 經(jīng)常有香客問(wèn)我澎胡,道長(zhǎng),這世上最難降的妖魔是什么娩鹉? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任攻谁,我火速辦了婚禮,結(jié)果婚禮上底循,老公的妹妹穿的比我還像新娘巢株。我一直安慰自己槐瑞,他們只是感情好熙涤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著困檩,像睡著了一般祠挫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悼沿,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天等舔,我揣著相機(jī)與錄音,去河邊找鬼糟趾。 笑死慌植,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的义郑。 我是一名探鬼主播蝶柿,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼非驮!你這毒婦竟也來(lái)了交汤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤劫笙,失蹤者是張志新(化名)和其女友劉穎芙扎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體填大,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戒洼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了允华。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈浇。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敷矫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汉额,到底是詐尸還是另有隱情曹仗,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蠕搜,位于F島的核電站怎茫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妓灌。R本人自食惡果不足惜轨蛤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虫埂。 院中可真熱鬧祥山,春花似錦、人聲如沸掉伏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斧散。三九已至供常,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸡捐,已是汗流浹背栈暇。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箍镜,地道東北人源祈。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像色迂,于是被迫代替她去往敵國(guó)和親香缺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容