SpringCloud--分布式事務

1.什么是事務

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

2.事務的ACID 特性

2.1.原子性

即不可分割性,事務要么全部被執(zhí)行,要么就全部不被執(zhí)行。

2. 2. 一致性或可串性

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

2.3. 隔離性

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

2.4. 持久性

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

3.事務并發(fā)帶來的問題

在典型的應用程序中,多個事務并發(fā)運行,經常會操作相同的數(shù)據(jù)來 完成各自的任務(多個用戶對同一 數(shù)據(jù)進行操作).并發(fā)雖然是必須的, 但可能會導致以下的問題。

3.1. 臟讀 (Dirty read)

當一個事務正在訪問數(shù)據(jù)并且對數(shù)據(jù)進行了修改, 而這種修改還沒有提交到數(shù)據(jù)庫中,這時另外一個事務也訪問了這 個數(shù) 據(jù),然后使用了這個數(shù)據(jù).因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另 外一個事務讀到的這個數(shù)據(jù)是“臟數(shù)據(jù)”,依據(jù)“臟數(shù)據(jù)”所做的操作可能 是不正確的。

3.2.丟失修改(Lost to modify)

指在一個事務讀取一個數(shù)據(jù)時,另外一 個事務也訪問了該數(shù)據(jù),那么在第一個事務中修改了這個數(shù)據(jù)后,第 二 個事務也修改了這個數(shù)據(jù)。這樣第一個事務內的修改結果就被丟失,因 此稱為丟失修改。

3.3. 不可重復讀(Unrepeatableread)

指在一個事務內多次讀同一數(shù)據(jù)。 在這個事務還沒有結束時,另一個事務也訪問該數(shù)據(jù)。那么,在第 一個 事務中的兩次讀數(shù)據(jù)之間,由于第二個事務的修改導致第一個事務兩次 讀取的數(shù)據(jù)可能不太一樣。這就發(fā)生了在一個事務內兩次讀到的數(shù)據(jù)是 不一樣的情況,因此稱為不可重復讀。

3.4.幻讀(Phantom read)

幻讀與不可重復讀類似。它發(fā)生在一個事務

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

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

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

4.事務的隔離級別

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

最低的隔離級別,允許讀取尚未提交 的數(shù)據(jù)變更,可能會導致臟讀、幻讀或不可重復讀。

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

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

4.3.REPEATABLE-READ( 可重復讀 )

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

4.4.SERIALIZABLE( 可串行化 )

最高的隔離級別,完全服從 ACID 的隔離級 別。所有的事務依次逐個執(zhí)行,這樣事務之間就完全不可能產生干擾,也就 是說,該級別可以防止臟讀、不可重復讀以及幻讀。

5.什么是分布式事務

分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務器上,且屬于不同的應用,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。本質上來說,分布式事務就是為了保證不同數(shù)據(jù)庫的數(shù)據(jù)一致性

6.為什么使用分布式事務

image.png
image.png

7.如何解決分布式事務的問題

使用消息中間件

手寫代碼解決分布式事務

使用第三方組件--->Seata阿里巴巴的產品

8.seata

Seata部署指南

8.1.什么是seata

Seata 是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分布式解決方案。

image.png

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

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

2.A服務開始遠程調用B服務【賬戶微服務】,此時XID會在微服務的調用鏈上傳播

3.B服務的RM向TC注冊分支事務,并將其納入XID對應的全局事務的管轄

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

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

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

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

9.搭建seata服務器

9.1.查看版本--版本要對應

image.png

9.2.下載seata1.3.0

因為我springcloud使用的是2.2.3

image.png
image.png

找對應的版本

image.png

9.3.解壓

image.png

9.4.修改conf/file.conf

seata默認保存到本地中,以后會有seata集群,得讓seata信息可以共享,我們應該修改它的保存位置:

image.png
image.png

serverTimezone這個是正確的

9.5.拉取mysql的驅動

image.png
image.png

9.6.創(chuàng)建數(shù)據(jù)庫并導入表結構

image.png

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

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

image.png
image.png
image.png

9.7.指定seata的注冊中心地址和配置中心的內容

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

9.8.需要把哪些配置項放入nacos配置中心

image.png

9.8.1.修改儲存方式

image.png
image.png

9.8.2.修改自己的MySQL

image.png

注意里面的serverTimezone這個是正確的

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.訪問一下自己nacos

image.png

10.配置微服務客戶端

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

image.png
image.png
image.png

10.2.在每個微服務中添加seata依賴

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

10.2.1.查看一下自己的版本

image.png

10.3.修改每個微服務的配置文件

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

10.4.設置事務發(fā)起者

image.png

10.5.啟動seata

image.png

10.6.測試

image.png
image.png
image.png
image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容