登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
分布式事务之2PC两阶段提交
分布式事务之2PC两阶段提交
[ 复制链接 ]
忆雏闲
2025-6-6 14:51:08
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
1. 分布式事务概述
1.1 问题背景
在分布式系统中,业务操作可能跨越多个服务或数据库(如订单服务、库存服务、支付服务),传统单机事务(ACID)无法满足跨网络节点的数据一致性需求。
网络不可靠
:服务间调用可能失败或超时。
数据一致性
:不同节点间的状态需最终一致。
性能与可用性
:避免长时间锁资源导致系统阻塞。
分布式事务的核心目标是确保
跨服务/数据库的操作要么全部成功,要么全部回滚
。
2. 两阶段提交(2PC)
原理
阶段一(Prepare)
:协调者询问所有参与者是否可提交,参与者锁定资源并返回“同意”或“拒绝”。
阶段二(Commit/Rollback)
:若所有参与者同意,协调者发送提交命令;否则发送回滚命令。
以下是一个简化的
Java 两阶段提交(2PC)
具体实现示例,包含协调者(Coordinator)和参与者(Participant)的核心逻辑。代码通过模拟数据库操作展示2PC的关键流程:
1. 参与者(Participant)实现
每个参与者代表一个独立的数据库或服务,需支持准备(Prepare)、提交(Commit)、回滚(Rollback)操作。
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 参与者(如数据库或服务)
*/
public class Participant {
private String name; // 参与者名称(如"DB1")
private AtomicBoolean prepared = new AtomicBoolean(false); // 准备状态
private AtomicBoolean committed = new AtomicBoolean(false); // 提交状态
public Participant(String name) {
this.name = name;
}
/**
* 阶段一:准备操作(锁定资源)
* @return true表示准备成功,false表示失败
*/
public boolean prepare() {
try {
// 模拟资源锁定,实际可能为操作数据库
System.out.println(name + ": Trying to prepare...");
Thread.sleep(100); // 模拟网络延迟
boolean success = Math.random() > 0.2; // 80%概率成功
if (success) {
prepared.set(true);
System.out.println(name + ": Prepared successfully.");
return true;
} else {
System.out.println(name + ": Prepare failed.");
return false;
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
/**
* 阶段二:提交操作
*/
public void commit() {
if (prepared.get()) {
// 实际提交事务(如更新数据库)
committed.set(true);
System.out.println(name + ": Committed.");
} else {
System.out.println(name + ": Cannot commit without preparation.");
}
}
/**
* 阶段二:回滚操作
*/
public void rollback() {
if (prepared.get()) {
// 实际回滚事务(如恢复数据)
prepared.set(false);
System.out.println(name + ": Rolled back.");
} else {
System.out.println(name + ": No need to rollback.");
}
}
// 检查是否已提交
public boolean isCommitted() {
return committed.get();
}
}
复制代码
2. 协调者(Coordinator)实现
协调者负责管理所有参与者,驱动两阶段提交流程。
import java.util.List;
/**
* 协调者(事务管理器)
*/
public class Coordinator {
private List<Participant> participants;
public Coordinator(List<Participant> participants) {
this.participants = participants;
}
/**
* 执行两阶段提交事务
* @return true表示事务成功提交,false表示失败
*/
public boolean executeTransaction() {
System.out.println("===== Phase 1: Prepare =====");
boolean allPrepared = participants.stream()
.allMatch(Participant::prepare);
System.out.println("===== Phase 2: Commit/Rollback =====");
if (allPrepared) {
participants.forEach(Participant::commit);
System.out.println("Transaction committed successfully.");
return true;
} else {
participants.forEach(Participant::rollback);
System.out.println("Transaction rolled back due to failures.");
return false;
}
}
}
复制代码
3. 客户端测试代码
模拟包含两个参与者的分布式事务场景。
import java.util.Arrays;
public class TwoPhaseCommitDemo {
public static void main(String[] args) {
// 创建两个参与者(如数据库DB1和DB2)
Participant db1 = new Participant("DB1");
Participant db2 = new Participant("DB2");
// 创建协调者并关联参与者
Coordinator coordinator = new Coordinator(Arrays.asList(db1, db2));
// 执行两阶段提交事务
boolean success = coordinator.executeTransaction();
// 输出最终状态
System.out.println("\nFinal Status:");
System.out.println("DB1 Committed: " + db1.isCommitted());
System.out.println("DB2 Committed: " + db2.isCommitted());
System.out.println("Transaction Result: " + (success ? "SUCCESS" : "FAILURE"));
}
}
复制代码
4. 运行结果示例
成功场景(所有参与者准备成功)
===== Phase 1: Prepare =====
DB1: Trying to prepare...
DB1: Prepared successfully.
DB2: Trying to prepare...
DB2: Prepared successfully.
===== Phase 2: Commit/Rollback =====
DB1: Committed.
DB2: Committed.
Transaction committed successfully.
Final Status:
DB1 Committed: true
DB2 Committed: true
Transaction Result: SUCCESS
复制代码
失败场景(某一参与者准备失败)
===== Phase 1: Prepare =====
DB1: Trying to prepare...
DB1: Prepared successfully.
DB2: Trying to prepare...
DB2: Prepare failed.
===== Phase 2: Commit/Rollback =====
DB1: Rolled back.
DB2: No need to rollback.
Transaction rolled back due to failures.
Final Status:
DB1 Committed: false
DB2 Committed: false
Transaction Result: FAILURE
复制代码
5. 关键点说明
阶段一(Prepare)
协调者询问所有参与者是否可以提交。
参与者锁定资源并记录操作日志。
任一参与者失败则整个事务回滚。
阶段二(Commit/Rollback)
若所有参与者准备成功,协调者发送提交命令。
若任一参与者失败,协调者发送回滚命令。
代码简化说明
实际应用中需处理网络超时、重试和持久化日志。
分布式场景下需使用RPC或HTTP替代本地方法调用。
生产环境建议使用成熟的XA协议实现(如Atomikos、Narayana)。
6. 2PC的局限性
同步阻塞
:参与者在Prepare阶段后需阻塞等待协调者指令。
单点故障
:协调者宕机可能导致事务悬挂。
数据不一致
:协调者与参与者在Commit阶段同时宕机时,可能部分提交。
关注微信公众号,查看更多技术文章。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
分布式
事务
2PC
两阶段
提交
相关帖子
革命你的 Git 提交消息 - GIM 1.8.0 发布了!
MySQL事务与锁机制实战——从ACID到并发控制
事务传播属性终极指南:用“团队协作”秒懂嵌套事务的边界艺术
约定式提交(一种用于给提交信息增加人机可读含义的规范)
Spring Cloud分布式事务(基于Seata AT模式,集成Nacos)--学习版
XXL-JOB v3.3.0 | 分布式任务调度平台
事务的四大特性(ACID)和隔离级别
sql server 事务日志备份异常恢复案例---惜分飞
对标MinIO!全新一代分布式文件系统诞生!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
革命你的 Git 提交消息 - GIM 1.8.0 发布了!
3
279
姚望舒
2025-11-14
业界
MySQL事务与锁机制实战——从ACID到并发控制
1
690
宛蛲
2025-11-20
业界
事务传播属性终极指南:用“团队协作”秒懂嵌套事务的边界艺术
4
882
稞冀
2025-11-21
安全
约定式提交(一种用于给提交信息增加人机可读含义的规范)
0
944
段干叶农
2025-11-24
业界
Spring Cloud分布式事务(基于Seata AT模式,集成Nacos)--学习版
2
253
米嘉怡
2025-11-27
安全
XXL-JOB v3.3.0 | 分布式任务调度平台
0
872
系味
2025-11-29
安全
事务的四大特性(ACID)和隔离级别
0
832
讥慰捷
2025-12-08
安全
sql server 事务日志备份异常恢复案例---惜分飞
0
476
莅耸
2025-12-12
业界
对标MinIO!全新一代分布式文件系统诞生!
2
563
聊账
2025-12-12
回复
(3)
骂治并
2025-12-1 02:10:34
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,学习下。
薯羞
2025-12-3 00:31:56
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
很好很强大 我过来先占个楼 待编辑
垢峒
5 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个好,看起来很实用
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
程序
签约作者
程序园优秀签约作者
发帖
忆雏闲
5 天前
关注
0
粉丝关注
17
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845357
3934307807
991123
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
311
《ESP32-S3使用指南—IDF版 V1.6》第五十五
941
纯前端调用大模型真的安全吗?我踩过的坑比
895
【分析式AI】-带你秒弄懂决策树与随机森林
97
DBLens 的数据安全、登录方式与离线使用说
71
国内开发者合规订阅 Claude Code 的 3 条最
153
Perforce QAC 2025.3 新版上线 | 速度与深
475
防止跨站脚本攻击(XSS)(完整版HTTP安全
352
Wayland下RDP服务器的搭建
887
Flink学习笔记:状态后端
532
csq-蓝桥杯python-基础语法2-列表与循环语
512
C#+VisionMaster 学习笔记(目录)-目录
586
ROS2核心概念之参数
88
【Agent】MemOS 源码笔记---(5)---记忆分类
129
.NET周刊【11月第4期 2025-11-23】
191
Oracle回滚与撤销(Undo)技术:从理论到实
223
吴恩达深度学习课程四:计算机视觉 第二周
854
jetson nano的ssh远程登录连接
638
Categraf 监控采集器常见问题汇总
825
11月和12月求职总结
950
2026年成都品牌主,如何选择AI优化搜索(AI