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.為什么使用分布式事務


7.如何解決分布式事務的問題
使用消息中間件
手寫代碼解決分布式事務
使用第三方組件--->Seata阿里巴巴的產品
8.seata
8.1.什么是seata
Seata 是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分布式解決方案。

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é)調其管轄之下的所有分支事務, 決定是否回滾

TM:事務發(fā)起者【在哪個方法上添加了全局事務注解的】
TC : 事務管理器【seata的服務端】
RM: 每個操作數(shù)據(jù)庫的微服務
TID: 全局事務id
TM和RM都屬于微服務代碼
TC: seata服務器。
9.搭建seata服務器
9.1.查看版本--版本要對應

9.2.下載seata1.3.0
因為我springcloud使用的是2.2.3


找對應的版本

9.3.解壓

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


serverTimezone這個是正確的
9.5.拉取mysql的驅動


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






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



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




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

9.8.1.修改儲存方式


9.8.2.修改自己的MySQL

注意里面的serverTimezone這個是正確的
9.8.3.修改組名


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

使用git打開nacos-config.sh

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

9.11.訪問一下自己nacos

10.配置微服務客戶端
10.1.在每個數(shù)據(jù)庫中創(chuàng)建unlog表



10.2.在每個微服務中添加seata依賴
<!--seata 一定要保證和seata服務的版本匹配-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
10.2.1.查看一下自己的版本

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ā)起者

10.5.啟動seata

10.6.測試



