⼀、本地事務
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、軟狀態:允許系統中數據存在中間狀態,這個中間狀態不會影響系統的可⽤性;也就是允許不同節點的數據副本之間在數據同步過程中存在延時。
四、分佈式事務解決⽅案
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,但是不能保證數據的強⼀致性,可以保證最終⼀致性
- 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: 取消執⾏業務。