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ù)
7.如何解決分布式事務(wù)的問(wèn)題
使用消息中間件
手寫代碼解決分布式事務(wù)
使用第三方組件--->Seata阿里巴巴的產(chǎn)品
8.seata
8.1.什么是seata
Seata 是一款開源的分布式事務(wù)解決方案晒夹,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT姊氓、TCC丐怯、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案翔横。
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ù)蟀俊, 決定是否回滾
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)
9.2.下載seata1.3.0
因?yàn)槲襰pringcloud使用的是2.2.3
找對(duì)應(yīng)的版本
9.3.解壓
9.4.修改conf/file.conf
seata默認(rèn)保存到本地中,以后會(huì)有seata集群,得讓seata信息可以共享,我們應(yīng)該修改它的保存位置:
serverTimezone這個(gè)是正確的
9.5.拉取mysql的驅(qū)動(dòng)
9.6.創(chuàng)建數(shù)據(jù)庫(kù)并導(dǎo)入表結(jié)構(gòu)
可以直接下載將scipt放到senta中
9.7.指定seata的注冊(cè)中心地址和配置中心的內(nèi)容
9.8.需要把哪些配置項(xiàng)放入nacos配置中心
9.8.1.修改儲(chǔ)存方式
9.8.2.修改自己的MySQL
注意里面的serverTimezone這個(gè)是正確的
9.8.3.修改組名
9.9.使用nacos/nacos-fonfig.sh 把配置信息放入nacos配置中心
使用git打開nacos-config.sh
9.10.指定nacos配置中心的地址
9.11.訪問(wèn)一下自己nacos
10.配置微服務(wù)客戶端
10.1.在每個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建unlog表
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.查看一下自己的版本
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