• 分布式事物【XA强一致性分布式事务实战、分布式架构的理论知识、TCC核心组成】(六)-全面详解(学习总结---从入门到深化)


    目录

    XA强一致性分布式事务实战_业务层实现

    分布式架构的理论知识_BASE理论

     BASE 理论三要素

    分布式事务解决方案_最终一致性分布式事务

    最终一致性分布式事务解决方案_TCC是什么

     TCC核心组成

    Hmily实现TCC分布式事务实战_认识Hmily-TCC

    Hmily实现TCC分布式事务实战_业务场景介绍


    XA强一致性分布式事务实战_业务层实现

    项目的业务逻辑层主要实现具体的跨库转账的业务逻辑,由于具体 的XA跨库分布式事务是由Atomikos框架内部实现的,因此在业务逻 辑层处理跨库转账的逻辑时,就像操作本地数据库一样简单。

    创建UserAccount类

    1. @Data
    2. @TableName("user_account")
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class UserAccount implements Serializable {
    6. private static final long serialVersionUID = 6909533252826367496L;
    7. /**
    8. * 账户编号
    9. */
    10. @TableId
    11. private String accountNo;
    12. /**
    13. * 账户名称
    14. */
    15. private String accountName;
    16. /**
    17. * 账户余额
    18. */
    19. private BigDecimal accountBalance;
    20. }

    创建UserAccountService接口

    1. public interface UserAccountService {
    2. /**
    3. * 跨库转账
    4. * @param sourceAccountNo 转出账户
    5. * @param targetSourceNo 转入账户
    6. * @param bigDecimal 金额
    7. */
    8. void transferAccounts(String sourceAccountNo, String targetSourceNo,BigDecimal transferAmount);
    9. }

    实现UserAccountService接口

    1. package com.tong.service.impl;
    2. import com.tong.entity.UserAccount;
    3. import com.tong.mapper1.UserAccountMapper1;
    4. import com.tong.mapper2.UserAccountMapper2;
    5. import com.tong.service.IUserAccountService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import org.springframework.transaction.annotation.Transactional;
    9. import java.math.BigDecimal;
    10. /**
    11. *

    12. * 服务实现类
    13. *

    14. *
    15. * @author itbaizhan
    16. * @since 05-13
    17. */
    18. @Service
    19. public class UserAccountServiceImpl implements IUserAccountService {
    20. @Autowired
    21. private UserAccountMapper1 userAccountMapper1;
    22. @Autowired
    23. private UserAccountMapper2 userAccountMapper2;
    24. /**
    25. * 跨库转账
    26. * @param sourceAccountNo 源账户
    27. * @param targetSourceNo 目标账户
    28. * @param bigDecimal 金额
    29. */
    30. @Transactional
    31. @Override
    32. public void transofer(String sourceAccountNo, String targetSourceNo, BigDecimal bigDecimal) {
    33. // 1. 查询原账户
    34. UserAccount sourceUserAccount = userAccountMapper1.selectById(sourceAccountNo);
    35. // 2. 查询目标账户
    36. UserAccount targetUserAccount = userAccountMapper2.selectById(targetSourceNo);
    37. // 3. 判断转入账户和转出账户是否为空
    38. if (sourceAccountNo != null && targetUserAccount != null){
    39. // 4. 判断转出账户是否余额不足
    40. if (sourceUserAccount.getAccountBalance().compareTo(bigDecimal) < 0){
    41. throw new RuntimeException("余额不足");
    42. }
    43. // 5.更新金额
    44. sourceUserAccount.setAccountBalance(sourceUserAccount.getAccountBalance().subtract(bigDecimal));
    45. // 6.张三账户减金额
    46. userAccountMapper1.updateById(sourceUserAccount);
    47. System.out.println(10/0);
    48. // 7.更新金额
    49. targetUserAccount.setAccountBalance(targetUserAccount.getAccountBalance().add(bigDecimal));
    50. // 8.张三账户减金额
    51. userAccountMapper2.updateById(targetUserAccount);
    52. }
    53. }
    54. }

    分布式架构的理论知识_BASE理论

     为什么会出现BASE理论

    CAP 理论表明,对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性)、Availability(可用性) 和 Partition tolerance(分区容忍性) 这三个条件的,最多只能满足其中两个。

     

     简介

    BASE 理论起源于 2008 年, 由 eBay 的架构师 Dan Pritchett 在 ACM 上发表。

     什么是BASE理论

    BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。

     核心思想:

    既是无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

     BASE 理论三要素

    基本可用(Basically Available)

    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。允许损失部分可用性。但是,这绝不等价于 系统不可用。

    软状态(Soft State)

    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。即允许系统在多个不同节点的数据副本存在数据延时。

     注意:

    用户在商城下单时,因网络超时等因素,订单处于“支付中”的状 态,待数据最终一致后状态将变更为“关闭”或“成功”状态。

     最终一致性(Eventual Consistency)

    最终一致性是指系统中的所有数据副本经过一定时间后,最终能够 达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

    总结 

    ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论, BASE是 CAP 理论中 AP 方案的延伸。符合Base理论的事务可以称为柔性事务。

    分布式事务解决方案_最终一致性分布式事务

     什么是最终一致性事务

    强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻 保持一致,查询任意节点的数据都能得到最新的数据结果。这就导 致在分布式场景,尤其是高并发场景下,系统的性能受到影响。而 最终一致性分布式事务解决方案并不要求参与事务的各节点数据时刻保持一致,允许其存在中间状态,只要一段时间后,能够达到数据的最终一致状态即可。

    典型方案

    为了解决分布式、高并发场景下系统的性能问题,业界基于Base理论提出了最终一致性分布式事务解决方案。

     适用场景

     

     优缺点

    最终一致性分布式事务解决方案的优点:

     最终一致性分布式事务解决方案的缺点:

    最终一致性分布式事务解决方案_TCC是什么

     概念

    TCC(Try-Confirm-Cancel)又称补偿事务。

    TCC核心思想

    TCC分布式事务最核心的思想就是在应用层将一个完整的事务操作分为三个阶段。在某种程度上讲,TCC是一种资源,实现了Try、 Confirm、Cancel三个操作接口。

     Try阶段

    Try阶段是准备执行业务的阶段,在这个阶段尝试执行业务。

     

     Confirm阶段

    Confirm阶段是确认执行业务的阶段,在这个阶段确认执行的业务。

     Cancel阶段

    Cancel阶段取消执行业务。

     TCC核心组成

    Hmily实现TCC分布式事务实战_认识Hmily-TCC

     概述

    Hmily是一款高性能,零侵入,金融级分布式事务解决方案,目前 主要提供柔性事务的支持,包含 TCC , TAC (自动生成回滚SQL) 方案, 未来还会支持 XA 等方案。

     

    Hmily实现TCC分布式事务实战_业务场景介绍

    案例程序分为3个部分

    项目公共模块、转出银行微服务和转入银行微服务。转出银行微服 务和转入银行微服务引用项目的公共模块,转出银行微服务作为 TCC分布式事务中的事务发起方,转入银行微服务作为TCC分布式事 务中的事务被动方。

     框架选择

     数据库表设计

    在模拟跨行转账的业务场景中,核心服务包括转出银行微服务和转入银行微服务,对应的数据库包括转出银行数据库和转入银行数据库。

    user_account账户数据表

    字段名称字段类型字段名称
    account_novarchar(64)账户编号
    account_namevarchar(64)账户名称
    account_balancedecimal(10,2)账户余额
    fransfer_amountdecimal(10,2)转账金额,用于锁定资源

    try_log记录表

     confirm_log记录表

     cancel_log记录表

     接下来,在192.168.66.100服务器的MySQL命令行执行如下命令创建转出银行数据库和数据表。

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for cancel_log
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `cancel_log`;
    7. CREATE TABLE `cancel_log` (
    8. `tx_no` varchar(64) CHARACTER SET utf8mb4
    9. COLLATE utf8mb4_general_ci NOT NULL COMMENT '全局事务编号',
    10. `create_time` datetime(0) NULL DEFAULT NULL
    11. COMMENT '创建时间',
    12. PRIMARY KEY (`tx_no`) USING BTREE
    13. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    14. COLLATE = utf8mb4_general_ci COMMENT = 'Cancel
    15. 阶段执行的日志记录' ROW_FORMAT = Dynamic;
    16. -- ----------------------------
    17. -- Records of cancel_log
    18. -- ----------------------------
    19. -- ----------------------------
    20. -- Table structure for confirm_log
    21. -- ----------------------------
    22. DROP TABLE IF EXISTS `confirm_log`;
    23. CREATE TABLE `confirm_log` (
    24. `tx_no` varchar(64) CHARACTER SET utf8mb4
    25. COLLATE utf8mb4_general_ci NOT NULL COMMENT '全局事务编号',
    26. `create_time` datetime(0) NULL DEFAULT NULL
    27. COMMENT '创建时间',
    28. PRIMARY KEY (`tx_no`) USING BTREE
    29. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    30. COLLATE = utf8mb4_general_ci COMMENT = 'Confirm
    31. 阶段执行的日志记录' ROW_FORMAT = Dynamic;
    32. -- ----------------------------
    33. -- Records of confirm_log
    34. -- ----------------------------
    35. -- ----------------------------
    36. -- Table structure for try_log
    37. -- ----------------------------
    38. DROP TABLE IF EXISTS `try_log`;
    39. CREATE TABLE `try_log` (
    40. `tx_no` varchar(64) CHARACTER SET utf8mb4
    41. COLLATE utf8mb4_general_ci NOT NULL COMMENT '全局事务编号',
    42. `create_time` datetime(0) NULL DEFAULT
    43. CURRENT_TIMESTAMP(0) COMMENT '创建时间'
    44. ,
    45. PRIMARY KEY (`tx_no`) USING BTREE
    46. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    47. COLLATE = utf8mb4_general_ci COMMENT = 'Try阶段
    48. 执行的日志记录' ROW_FORMAT = Dynamic;
    49. -- ----------------------------
    50. -- Records of try_log
    51. -- ----------------------------
    52. -- ----------------------------
    53. -- Table structure for user_account
    54. -- ----------------------------
    55. DROP TABLE IF EXISTS `user_account`;
    56. CREATE TABLE `user_account` (
    57. `account_no` varchar(64) CHARACTER SET
    58. utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
    59. COMMENT '账户编号',
    60. `account_name` varchar(50) CHARACTER SET
    61. utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT
    62. NULL COMMENT '账户名称',
    63. `account_balance` decimal(10, 2) NULL DEFAULT
    64. NULL COMMENT '账户余额',
    65. `transfer_amount` decimal(10, 2) NULL DEFAULT
    66. NULL COMMENT '转账金额',
    67. PRIMARY KEY (`account_no`) USING BTREE
    68. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    69. COLLATE = utf8mb4_general_ci COMMENT = '账户信
    70. 息' ROW_FORMAT = Dynamic;
    71. -- ----------------------------
    72. -- Records of user_account
    73. -- ----------------------------
    74. INSERT INTO `user_account` VALUES ('1001',
    75. '张三', 10000.00, 0.00);
    76. SET FOREIGN_KEY_CHECKS = 1;

    在192.168.66.100服务器的MySQL命令行执行如下命令创建转入银行数据库和数据表。

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for cancel_log
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `cancel_log`;
    7. CREATE TABLE `cancel_log` (
    8. `tx_no` varchar(64) CHARACTER SET utf8mb4
    9. COLLATE utf8mb4_general_ci NOT NULL COMMENT '全局事务编号',
    10. `create_time` datetime(0) NULL DEFAULT NULL
    11. COMMENT '创建时间',
    12. PRIMARY KEY (`tx_no`) USING BTREE
    13. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    14. COLLATE = utf8mb4_general_ci COMMENT = 'Cancel阶段执行的日志记录' ROW_FORMAT = Dynamic;
    15. -- ----------------------------
    16. -- Records of cancel_log
    17. -- ----------------------------
    18. -- ----------------------------
    19. -- Table structure for confirm_log
    20. -- ----------------------------
    21. DROP TABLE IF EXISTS `confirm_log`;
    22. CREATE TABLE `confirm_log` (
    23. `tx_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '全局事务编号',
    24. `create_time` datetime(0) NULL DEFAULT NULL
    25. COMMENT '创建时间',
    26. PRIMARY KEY (`tx_no`) USING BTREE
    27. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    28. COLLATE = utf8mb4_general_ci COMMENT = 'Confirm
    29. 阶段执行的日志记录' ROW_FORMAT = Dynamic;
    30. -- ----------------------------
    31. -- Records of confirm_log
    32. -- ----------------------------
    33. -- ----------------------------
    34. -- Table structure for try_log
    35. -- ----------------------------
    36. DROP TABLE IF EXISTS `try_log`;
    37. CREATE TABLE `try_log` (
    38. `tx_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '全
    39. 局事务编号',
    40. `create_time` datetime(0) NULL DEFAULT NULL
    41. COMMENT '创建时间',
    42. PRIMARY KEY (`tx_no`) USING BTREE
    43. ) ENGINE = InnoDB CHARACTER SET = utf8mb4
    44. COLLATE = utf8mb4_general_ci COMMENT = 'Try阶段
    45. 执行的日志记录' ROW_FORMAT = Dynamic;
    46. -- ----------------------------
    47. -- Records of try_log
    48. -- ----------------------------
    49. -- ----------------------------
    50. -- Table structure for user_account
    51. -- ----------------------------
    52. DROP TABLE IF EXISTS `user_account`;
    53. CREATE TABLE `user_account` (
    54. `account_no` varchar(64) CHARACTER SET
    55. utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账户编号',
    56. `account_name` varchar(50) CHARACTER SET
    57. utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT
    58. NULL COMMENT '账户名称',
    59. `account_balance` decimal(10, 2) NULL DEFAULT
    60. NULL COMMENT '账户余额',
    61. `transfer_amount` decimal(10, 2) NULL DEFAULT
    62. NULL COMMENT '转账金额',
    63. PRIMARY KEY (`account_no`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4
    64. COLLATE = utf8mb4_general_ci COMMENT = '账户信息' ROW_FORMAT = Dynamic;
    65. -- ----------------------------
    66. -- Records of user_account
    67. -- ----------------------------
    68. INSERT INTO `user_account` VALUES ('1002','李四', 10000.00, 0.00);
    69. SET FOREIGN_KEY_CHECKS = 1;
  • 相关阅读:
    【第49篇】Swin Transformer V2:扩展容量和分辨率
    【数一】【概率论与数理统计】
    使用libmodbus库开发modbusTcp从站(支持多个主站连接)
    23.2 Bootstrap 卡片
    学习-Java输入输出之字节缓冲IO流之复制文件
    R Wordcloud2 库 词云图
    TiDB Vector 抢先体验之用 TiDB 实现以图搜图
    Oracle DBlink使用方法
    142.创建序列化类、序列化测试、反序列化测试
    (四) ES6 新特性 —— 参数默认值与spread扩展运算符
  • 原文地址:https://blog.csdn.net/m0_58719994/article/details/131691272