⼀、本地事務
1、ACID特性
原⼦性(A)⼀致性(C)隔離性(I)永續性(D)
2、事務的隔離級別
兩個或多個事務併發操作相同的資料的時候事務之間的相互訪問關係
- 查詢當前隔離級別:select @@tx_isolation
- 設定隔離級別:set session transaction isolation level 隔離級別
- 開啟事務:start transaction
- 提交事務:commit
- 事務回滾:rollaback
⼆、分散式事務
分散式事務:就是指事務的參與者、⽀持事務的伺服器(資料庫伺服器)、資源伺服器以及事務的管理器分佈在分散式系統的不同節點中
1、分散式事務場景
2、分散式事務 & 分散式鎖
分散式事務:完成事務的多個步驟位於不同的節點上分散式鎖:⽤於解決分散式系統中事務之間的併發訪問問題
三、CAP定律和BASE理論
分散式系統設計中的CAP定律和base理論
1、CAP定律
1、CAP原則⼜稱CAP定律,指的是在⼀個分散式系統中的⼀致性(Consistency)、可⽤性(Availability)、分割槽容錯性三者之間的權衡
2、CAP 原則指的是,這三個要素最多隻能同時實現兩點,不可能三者兼顧
- 在分散式系統⽆法同時滿⾜CA,如果需要滿⾜CA,則項⽬結構必須為單體架構
- 在分散式系統中可以滿⾜CP 或者 AP,常規情況下微服務架構更多的是滿⾜AP
1、(強)⼀致性(Consistency) :如果系統對⼀個寫操作返回成功,那麼之後的讀請求都必須讀到這個新資料;如果寫操作返回失敗,則所有的讀操作都不能讀到這個資料,對調⽤者⽽⾔資料具有強⼀致性。
- 強⼀致性:⼀旦寫操作成功了,則所有的讀操作都必須讀取新資料;(如果想要保證資料的強⼀致性,就必須使⽤同⼀個資料儲存/資料庫)
- 弱⼀致性/最終⼀致性:當寫操作成功之後,允許在⼀定的時間內讀取到舊資料,但經過⼀段時間之後最終可以讀取到新資料,保證資料最終是⼀致的
2、可⽤性(Availability) :當⽤戶請求服務時,服務⼀定要給與響應,可以是降級響應。3、分割槽容錯性(Partition tolerance) :在分散式系統中服務節點都是⽹絡分佈,⼀個或部分節點出現故障,其他節點仍能對外提供服務。
2、BASE理論
1、BASE是Basically Available(基本可⽤),Soft State(軟狀態)和EventuallyConsistent(最終⼀致性)三個短語的縮寫。2、BASE理論,是對CAP中⼀致性和可⽤性權衡的結果,其來源於對⼤規模互聯⽹分散式系統實踐的總結,是基於CAP定律逐步演化⽽來。其核⼼思想是即使⽆法做到強⼀致性,但每個應⽤都可以根據⾃身業務特點,採⽤適當的⽅式來使系統達到最終⼀致性。
1、基本可⽤:指的是分散式系統中出現不可預知故障,允許其損失⼀部分的功能,但要保證整個系統的可⽤。
2、軟狀態:允許系統中資料存在中間狀態,這個中間狀態不會影響系統的可⽤性;也就是允許不同節點的資料副本之間在資料同步過程中存在延時。
3、最終⼀致性:要求所有的資料副本在經過⼀段時間的延時之後,最終能夠達到⼀致的狀態。
四、分散式事務解決⽅案
1、剛性事務與柔性事務
1、剛性事務:滿⾜ACID特性的事務(強⼀致性)————本地事務2、柔性事務:滿⾜BASE理論的事務(最終⼀致性)————分散式事務3、如何保證分散式事務的最終⼀致性?
- XA-2PC
- 補償
- 非同步確保
- 最⼤努⼒通知
2、XA-分散式事務管理模型
XA模型—為分散式事務的多個參與者新增到⼀個事務管理器(事務協調者)
3、2PC—兩段式提交
問題:1.效能問題:所有事務的參與者在提交階段處於阻塞狀態,佔⽤系統資源(資料庫連線)2.可靠性問題:如果事務協調者出現單點故障,將導致所有的參與者都處於鎖定狀態3.資料⼀致性問題:事務協調者和部分參與者在事務提交階段掛了,有可能導致資料⼀致性問題優點:近乎100%的保證了資料的⼀致性缺點:實現複雜,犧牲了可⽤性,對效能影響⽐較⼤;適⽤於併發不⾼但是對資料⼀致性要求⽐較⾼的場景。
4、3PC—三段式提交
三段式提交就是在兩段式提交進⾏改進的版本:
- 增了⼀個資源檢查階段(詢問是否可以提交)
- 增加了超時設定——避免因TM故障導致TC⻓時間等待佔⽤系統資源
存在的問題:和2PC提交⼀樣,執⾏SQL之後需要保持資料庫連線,影響系統效能
5、TCC
TCC, 即Try-Commit-Cancel
優點:1.效能提升:資源佔⽤的粒度較⼩,不會⻓時間鎖定所有資源2.資料的最終⼀致性:基於commit和cancel的冪等性
6、訊息佇列
五、分散式事務框架 Tx-LCN
3PC——適⽤於對資料⼀致性要求較⾼的場景,對效能會有⼀定損耗TCC——效能優於3PC,但是不能保證資料的強⼀致性,可以保證最終⼀致性
基於3PC、TCC等分散式事務解決⽅案已經有成熟的落地框架:
- zookeeper
- Tx-LCN
- Spring Cloud alibaba seata
LCN模式是透過代理Connection⽅式實現對本地事務的操作,然後由TxManager統⼀協調管理
1、⼯作流程
2、TxLCN⽀持的分散式事務管理⽅式
1、@LcnTransaction lcn模式LCN模式是透過代理Connection的⽅式實現對本地事務的操作,然後在由TxManager統⼀協調控制事務。當本地 事務提交回滾或者關閉連線時將會執⾏假操作,該代理的連線將由LCN連線池管理。2、@TxcTransaction txc模式TXC模式命名來源於淘寶,實現原理是在執⾏SQL之前,先查詢SQL的影響資料,然後儲存執⾏的SQL快照資訊和 建立鎖。當需要回滾的時候就採⽤這些記錄資料回滾資料庫,⽬前鎖實現依賴redis分散式鎖控制。3、@TccTransaction tcc模式TCC事務機制相對於傳統事務機制(X/Open XA Two-Phase-Commit),其特徵在於它不依賴資源管理器(RM)對XA 的⽀持,⽽是透過對(由業務系統提供的)業務邏輯的排程來實現分散式事務。主要由三步操作,Try: 嘗試執⾏業務、 Confirm:確認執⾏業務、 Cancel: 取消執⾏業務。
六、搭建TM伺服器
1、按照TM的要求建庫建表
CREATE TABLE `t_tx_exception` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `transaction_state` tinyint(4) NULL DEFAULT NULL, `registrar` tinyint(4) NULL DEFAULT NULL, `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 待處理 1已處理', `remark` varchar(10240) NULL DEFAULT NULL COMMENT '備註', `create_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 967 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
2、配置並啟動redis
3、建立SpringBoot項⽬
4、導⼊tm依賴
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tm</artifactId> <version>5.0.2.RELEASE</version> </dependency>
5、配置application.properties(官⽅說明⽂檔提供)
spring.application.name=TransactionManager server.port=8801 # JDBC 資料庫配置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://47.96.11.185:3306/fmmall2?characterEncoding=UTF-8&serverTimeZone=UTC spring.datasource.username=root spring.datasource.password=admin123 # 資料庫⽅⾔ spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect # 為TM建立持久化資料庫表 spring.jpa.hibernate.ddl-auto=update # TM監聽Socket端⼝. 預設為 ${server.port} - 100 tx-lcn.manager.port=8070 # TM後臺登陸密碼,預設值為codingapi tx-lcn.manager.admin-key=admin123 # 雪花演算法的sequence位⻓度,預設為12位. tx-lcn.manager.seq-len=12 # 異常回撥開關。開啟時請制定ex-url tx-lcn.manager.ex-url-enabled=false # 開啟⽇志,預設為false tx-lcn.logger.enabled=true tx-lcn.logger.driver-class-name=${spring.datasource.driver-classname} tx-lcn.logger.jdbc-url=${spring.datasource.url} tx-lcn.logger.username=${spring.datasource.username} tx-lcn.logger.password=${spring.datasource.password} # redis 的設定資訊. 線上請⽤Redis Cluster spring.redis.host=47.96.11.185 spring.redis.port=6379 spring.redis.password=12345678
6、啟動類新增 @EnableTransactionManagerServer 註解
@SpringBootApplication @EnableTransactionManagerServer public class TxmanagerApplication { public static void main(String[] args) { SpringApplication.run(TxmanagerApplication.class, args); } }
7、啟動項⽬,訪問8801,出現如下界⾯(使⽤設定的密碼登入)
七、在服務中新增分散式事務⽀持
1、新增TC依賴
<dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-txmsg-netty</artifactId> <version>5.0.2.RELEASE</version> </dependency>
2、配置服務連結到TM
spring: datasource: null driver-class-name: com.mysql.jdbc.Driver url: 'jdbc:mysql://localhost:3306/fmmall2?characterEncoding=utf-8' username: root password: admin123 tx-lcn: client: null manager-address: 'localhost:8070'
3、在啟動類新增 @EnableDistributedTransaction 註解
4、新增分散式事務管理註解
@TccTransaction @Transactional public void addOrder(Order order) { orderDAO.insertOrder(order); ResultVO vo = repoInvokeService.update(order.getGid(), 1); System.out.println(vo); }
1、@LcnTransaction lcn模式LCN模式是透過代理Connection的⽅式實現對本地事務的操作,然後在由TxManager統⼀協調控制事務。當本地 事務提交回滾或者關閉連線時將會執⾏假操作,該代理的連線將由LCN連線池管理。2、@TxcTransaction txc模式TXC模式命名來源於淘寶,實現原理是在執⾏SQL之前,先查詢SQL的影響數據,然後儲存執⾏的SQL快⾛資訊和 建立鎖。當需要回滾的時候就採⽤這些記錄資料回滾資料庫,⽬前鎖實現依賴redis分散式鎖控制。3、@TccTransaction tcc模式TCC事務機制相對於傳統事務機制(X/Open XA Two-Phase-Commit),其特徵在於它不依賴資源管理器(RM)對XA 的⽀持,⽽是透過對(由業務系統提供的)業務邏輯的排程來實現分散式事務。主要由三步操作,Try: 嘗試執⾏業務、Confirm:確認執⾏業務、 Cancel: 取消執⾏業務。