浅析SQL Server实现分布式事务的两阶段提交协议2PC

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介:

不久之前团队有个新人问我一个很重要的web服务接口如何保证事务的问题。因为涉及到跨库事务,当时我只是回答目前我们的SOA框架都不支持跨库事务。然后就问到了数据库跨库事务是如何实现的,我只能凭印象含糊回答多数是基于数据库日志(后来知道就是所谓的预写日志Write-Ahead Logging),具体数据库内部如何控制数据一致性则真的说不清楚。后来一起查了一下事务的资料,原来DB的事务控制除了基于预写日志还要实现两阶段提交协议(2PC),参考MSDN摘抄两段加深印象。

一、2PC的两个阶段

1、准备阶段(Prepare Phase)

When the transaction manager receives a commit request, it sends a prepare command to all of the resource managers involved in the transaction. Each resource manager then does everything required to make the transaction durable, and all buffers holding log images for the transaction are flushed to disk. As each resource manager completes the prepare phase, it returns success or failure of the prepare to the transaction manager.

2、提交阶段(Commit Phase)

If the transaction manager receives successful prepares from all of the resource managers, it sends commit commands to each resource manager. The resource managers can then complete the commit. If all of the resource managers report a successful commit, the transaction manager then sends a success notification to the application. If any resource manager reported a failure to prepare, the transaction manager sends arollback command to each resource manager and indicates the failure of the commit to the application.

 

二、2PC的原理示例

如何理解2PC实现分布式事务的呢?下面举例说明下。

假设有A、B、C三个数据库,A作为一个事务发起者,称为“主库”,B和C则称为”从库”。假设需要执行一个在A、B和C三个库的某个表中插入一行数据的事务。

准备阶段(Prepare Phase),A锁定表,并将事务写入自己的预写日志;A将事务发给从库B和C,B和C也各自锁定自己的表,并把事务写入预写日志,完成后返回告诉A准备阶段完成;
提交阶段(Commit Phase),A开始执行自己的事务,并通知B和C提交事务。如果在这个过程中没有任何错误,那么操作将在A、B和C库中完成;如果发生错误,比如从库C超时无响应,或者从库C磁盘空间不足…A将通知所有参与事务的B和C回滚该事务,并且回滚A自己的事务。

dbtrans

 

顺便重点再提一下预写日志,因为数据库的这种日志无比重要,普通的增删改查、数据还原、单库事务以及本文的分布式事务都离不开它,没有它绝大多数主流数据库的数据一致性根本无法实现。

到这里大家应该已经看到,相比单库事务,分布式事务控制更加复杂,而且开销极大。虽然一些高级开发框架如.net framework提供了较为强大丰富的类库如TransactionScope来简化开发分布式事务,但是建议能不用则不用,因为它被反映普遍存在性能问题无意识的死锁问题。这种分布式事务的场景如果频繁出现,重新拆分系统合理规划架构才是正道。

 

总结:在大型web应用中如何保持事务这个话题被问得非常多,个人已经是不止一次被问到所维护的站点是如何实现事务的。在分布式多集群环境下,业务逻辑错综复杂,保证数据库完全可靠存储当然并不容易。但是web应用程序的一个典型特点是读多写少,牺牲极少的数据一致性获得系统的高可扩展性可维护性以及高性能,那么一点点的数据不准确在业务上完全可以容忍,何况我们有日志,后续还有很多补偿措施,甚至直接人工介入处理也未尝不可。







本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/p/Talk_About_2PC_In_Implementing_DBTransaction.html,如需转载请自行联系原作者

相关实践学习
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
16天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
24天前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
251 1
|
2月前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
168 1
|
12小时前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
8 2
|
5天前
|
SQL 存储 测试技术
|
4天前
|
SQL 机器学习/深度学习 搜索推荐
SQL SERVER 转换失败
【6月更文挑战第25天】
|
9天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何迁移SQL Server
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7天前
|
SQL 存储 机器人
SQL Server 中 RAISERROR 的用法详解
SQL Server 中 RAISERROR 的用法详解
|
17天前
|
SQL 存储 关系型数据库
关系型数据库中的SQL Server
【6月更文挑战第11天】
49 3
|
16天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程