最近研究了下我们这边使用分布式事务的场景,顺便学习了下分布式框架的源码。
场景:
积分兑换优惠券,两步操作 第一步调用积分服务扣积分,第二步发放优惠券。
分布式框架支持场景
1. 回补操作,简化的二阶段模型,一阶段做真实的扣除,一阶段成功则二阶段不做处理,一阶段失败则做回补操作。比如:扣积分成功 ,发放优惠券失败,那么则调用回补积分的接口进行补偿。
2. 二阶段,try conform cancel 一阶段进行冻结,二阶段真实的扣除或者取消。
分布式事务框架调用流程
流程说明:
1. 状态是分为业务状态和事务状态。状态流程: 业务状态init, 业务状态成功or失败。初始化事务状态process_wating, 二阶段处理事务状态processing,每个action做二阶段处理同时更新每个action的status,根据每个action的综合结果将整个事务的处理结果置为成功或者失败。
2. 最后几步只会执行其中一步,如果业务状态成功且是回补操作则啥也不用干,如果业务状态失败且是回补操作则执行回补参与者。如果是二阶段则根据业务状态做cancel或者confirm参与者和发起者。
db脚本:
tx_info | CREATE TABLE `tx_info` ( `id` bigint(64) NOT NULL COMMENT 'id', `tx_id` varchar(256) NOT NULL COMMENT '事务id', `business_type` varchar(32) NOT NULL COMMENT '业务类型', `business_id` varchar(128) NOT NULL COMMENT '业务id', `status` varchar(32) NOT NULL COMMENT '事务状态', `retry_count` int(11) DEFAULT NULL COMMENT '重试次数,针对部分状态才有意义', `check_back_info` text COMMENT '事务回查信息', `participants_info` text COMMENT '参与者基本信息', `ext_properties` text COMMENT '额外属性字段', `version` int(11) DEFAULT NULL COMMENT '版本控制', `create_time` datetime NOT NULL COMMENT '创建时间', `db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `biz_status` varchar(32) NOT NULL DEFAULT 'UNKOWN' COMMENT '业务执行状态', PRIMARY KEY (`id`,`create_time`), KEY `idx_tx_id` (`tx_id`(255)), KEY `idx_business_id` (`business_id`), KEY `idx_create_time` (`create_time`), KEY `idx_update_time` (`db_update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='事务信息表' /*!50100 PARTITION BY RANGE (to_days(create_time)) (PARTITION p20161101 VALUES LESS THAN (736634) ENGINE = InnoDB, PARTITION p20161201 VALUES LESS THAN (736664) ENGINE = InnoDB, PARTITION p20170101 VALUES LESS THAN (736695) ENGINE = InnoDB, PARTITION p20170201 VALUES LESS THAN (736726) ENGINE = InnoDB, PARTITION p20170301 VALUES LESS THAN (736754) ENGINE = InnoDB, PARTITION p20170401 VALUES LESS THAN (736785) ENGINE = InnoDB, PARTITION p20170501 VALUES LESS THAN (736815) ENGINE = InnoDB, PARTITION p20170601 VALUES LESS THAN (736846) ENGINE = InnoDB, PARTITION p20170701 VALUES LESS THAN (736876) ENGINE = InnoDB) action_info | CREATE TABLE `action_info` ( `id` bigint(20) NOT NULL COMMENT '主键id', `tx_id` varchar(256) NOT NULL COMMENT '事务id', `business_type` varchar(32) NOT NULL COMMENT '业务类型', `business_id` varchar(128) NOT NULL COMMENT '业务id', `action_type` varchar(32) NOT NULL COMMENT '操作类型', `action_name` varchar(64) DEFAULT NULL COMMENT '操作名', `status` varchar(32) NOT NULL COMMENT '操作状态', `ext_properties` text COMMENT '额外属性字段', `version` int(11) NOT NULL COMMENT '版本信息', `create_time` datetime NOT NULL COMMENT '创建时间', `db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`,`create_time`), UNIQUE KEY `idx_txid_aname` (`tx_id`(255),`action_name`,`create_time`), KEY `idx_business_id` (`business_id`), KEY `idx_create_time` (`create_time`), KEY `idx_update_time` (`db_update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='参与者操作信息表' /*!50100 PARTITION BY RANGE (to_days(create_time)) (PARTITION p20161101 VALUES LESS THAN (736634) ENGINE = InnoDB, PARTITION p20161201 VALUES LESS THAN (736664) ENGINE = InnoDB, PARTITION p20170101 VALUES LESS THAN (736695) ENGINE = InnoDB, PARTITION p20170201 VALUES LESS THAN (736726) ENGINE = InnoDB, PARTITION p20170301 VALUES LESS THAN (736754) ENGINE = InnoDB, PARTITION p20170401 VALUES LESS THAN (736785) ENGINE = InnoDB, PARTITION p20170501 VALUES LESS THAN (736815) ENGINE = InnoDB, PARTITION p20170601 VALUES LESS THAN (736846) ENGINE = InnoDB, PARTITION p20170701 VALUES LESS THAN (736876) ENGINE = InnoDB)
技术原理:
1. dubbo泛化调用,参照上一篇博客。
相关推荐
实现分布式事务还需要JDBC驱动程序支持XA,以及一个支持XA的容器,如应用程序服务器或Spring框架。 7. **数据库优化** - **调整SGA区**:SGA(System Global Area)是Oracle数据库内存结构的一部分,调整其大小和...
《若依RuoYi框架剖析笔记》是基于江南一点雨的...以上是RuoYi框架剖析笔记的关键知识点,涵盖了从项目改造到分布式事务,再到前端Vue3和工作流引擎Flowable的深度探讨,对于理解和运用RuoYi框架有着极高的参考价值。
此外,该项目也提供了评论功能,便于开发者交流心得,共同提升对分布式事务处理的理解和应用水平。 总之,“tcc-transaction-master-1.2.x”是一个有价值的示例,它展示了如何在Dubbo框架下实现TCC事务,为分布式...
本文主要围绕"J2EE Design and Development"的学习心得展开,探讨如何在JavaEE开发中实现高效且具有可扩展性和可维护性的程序架构设计。 分布式系统是现代企业级应用的基石,尤其是在处理大数据量、高并发场景时,...
JTA用于管理分布式事务,确保在多资源环境中的一致性。RMI是Java中实现远程对象调用的技术,使得跨网络的通信变得简单。JMS则用于异步消息传递,允许应用程序之间解耦并提高可扩展性。 J2EE的核心理念是分层架构,...
在本文中,我们将深入探讨JavaEE的基本构成、核心技术和学习心得。 JavaEE的学习分为多个部分,首先是基础服务,包括对平台的概述,如JavaEE的发展历程、架构、组件和服务。这部分还涉及开发环境的选择和应用服务的...
- **JTA**:Java Transaction API,用于管理和协调分布式事务。 - **RMI**:Remote Method Invocation,实现了远程对象的调用,是EJB的基础之一。 - **JMS与EJB**:Java Message Service用于实现异步消息传递,而...
5. **事务管理**: OJB集成了JTA(Java Transaction API),可以处理分布式事务,确保数据的一致性和完整性。 **OJB工作流程** 1. **对象持久化**: 开发者创建Java对象并设置其属性,然后使用OJB的API将对象保存到...
【Java学习心得】 Java作为一门广泛使用的编程语言,学习它是一项既有挑战又有乐趣的过程。从初识语法到熟练掌握各种框架和技术,每一步都需要扎实的基础和不断的实践。 首先,Java学习的基础是掌握基本语法和核心...
8. **中间件**:可能包含消息队列(如RabbitMQ、Kafka)、分布式服务治理(如Dubbo、Zookeeper)、分布式事务解决方案(如2PC、TCC)等内容。 9. **LeetCode解题算法**:通过LeetCode平台的题目来训练和提升算法...
这份学习资料涵盖了30多个架构学习心得,旨在帮助读者掌握J2EE平台的核心技术和高级概念,同时深入理解开源架构的设计与实践。 J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建企业级应用的框架...
- **分布式系统**:涉及分布式系统的原理、分布式事务管理、CAP理论、一致性哈希算法等内容。 - **高可用性与高并发**:讲解如何构建高可用系统、负载均衡策略、集群部署、性能调优等。 #### 二、面试真题解析 -...
"学习总结desswww"这个标题暗示了这是一个关于Java高级开发的学习资料集合,可能包含了作者在学习过程中的笔记、心得或者项目实践。描述中的"java 高级 开发 资料"进一步确认了这份资料专注于Java的高级特性和开发...
在本JavaEE实验中,我们将深入探讨Java企业级开发的核心概念和技术,...实践是检验真理的唯一标准,这些心得体会和源码将是提升你JavaEE开发技能的宝贵财富。不断地练习和探索,你将在企业级应用开发领域更加得心应手。
这表明笔记是作者个人的学习和实践心得,可能包含了作者对Spring框架独特的理解和实践经验,可能包括了一些实战案例和解决常见问题的方法。这样的笔记往往具有很高的实用性和个人色彩,可以帮助读者更好地理解和掌握...
综上所述,JavaWeb学习涉及到的领域广泛,从基础的Servlet和JSP到复杂的框架如Spring,再到数据库交互和会话管理,都需要深入理解和实践。对于初学者,可以从搭建开发环境、编写简单的Servlet和JSP页面开始,逐步...
3. **分布式系统**:CAP理论、消息队列、分布式缓存、分布式事务等。 4. **服务端渲染**:Node.js、React服务端渲染等。 5. **前端框架**:Vue.js、Angular等。 6. **大数据技术**:Hadoop、Spark等。 #### 五、...
8. **数据库操作**:JDBC(Java Database Connectivity)是连接Java应用程序和数据库的标准API,学习如何使用Statement、PreparedStatement和CallableStatement进行SQL操作,以及事务管理和连接池的概念。...
9. **云计算与分布式系统**:了解AWS、Azure、Google Cloud等主流云平台,以及分布式计算框架如Hadoop、Spark,对于从事云计算相关工作的候选人尤其重要。 10. **软件设计模式**:熟悉23种GOF设计模式,能够灵活...