合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
2PC,全称为两阶段提交(Two-Phase Commit),是一种在分布式系统中用来保证事务原子性和一致性的协议。它主要用于协调分布式数据库或分布式事务环境中的多个参与者,确保所有参与者要么一起成功提交事务,要么一起回滚事务,以保持数据的一致性。
图片
在2PC协议中有两个主要阶段:
事务协调器接收到发起事务的客户端请求后,向所有参与该事务的资源管理器(例如数据库、服务节点等)发送“准备提交”请求。
每个资源管理器执行事务操作,并将事务相关的更改锁定但不提交,然后回复事务协调器它们是否准备好提交事务(根据各自是否能够成功完成事务而定)。
如果事务协调器收到了所有资源管理器的肯定答复,即所有参与者都准备好提交事务,则向所有参与者发出“正式提交”指令。
若协调器收到任何一个参与者的否定响应,或者在等待超时后仍有参与者未响应,则向所有参与者发出“回滚事务”的指令。
通过这种方式,2PC确保了所有节点要么全部完成事务,要么全部撤销事务,从而维护了分布式环境下的事务原子性。然而,2PC也存在一些缺点,比如单点故障问题(即事务协调器宕机可能导致事务长期阻塞)、网络分区情况下的不确定性以及性能上的潜在瓶颈。
Seata把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务 达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个关系数据库的本地事务,下图是全局事务与分支事务的关系图:
图片
与 传统2PC 的模型类似,Seata定义了3个组件来协议分布式事务的处理过程
图片
案例分析:两个账户在不同的银行(张三在bank1、李四在bank2),bank1和bank2是两个微服务。交易过程是,张三给李四转账指定金额。
上述交易步骤,要么一起成功,要么一起失败,必须是一个整体性的事务。
图片
为了简化环境搭建,小编这里采用file启动seata,项目搭建也只是两个普通的SpringBoot项目,未使用微服务。
官方下载地址:https://github.com/seata/seata/releases
registry.type=file 其类型设置为 file 时,意味着 Seata 的服务注册中心不依赖于外部的如 Nacos、Eureka、Zookeeper 等第三方注册中心,而是使用本地文件的方式来存储和管理服务节点信息。这种模式主要用于快速测试或简单的单机部署场景,因为在这种模式下无法自动发现和管理集群环境中的其他 Seata Server 节点,不具备高可用性。
config.type=file 表示 Seata 使用本地文件作为配置源。这意味着 Seata 会从指定的本地文件中读取全局事务协调器(TC)、事务管理器(TM)和资源管理器(RM)等组件所需的配置信息,而不是通过Nacos、Apollo或其他远程配置中心获取配置。这种方式同样适用于快速验证和简单部署情况,实际生产环境中可能需要结合分布式配置中心来动态更新和管理配置。
图片
图片
CREATE DATABASE `bank1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `account_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '户主姓名',
`account_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '银行卡号',
`account_password` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '帐户密码',
`account_balance` double NULL DEFAULT NULL COMMENT '帐户余额',
PRIMARY KEY (`id`) USING BTREE )
ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
INSERT INTO `account_info` VALUES (2, '张三的账户', '1', '', 10000);
TOP