浅析SQL Server实现分布式事务的两阶段提交协议2PC
不久之前团队有个新人问我一个很重要的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 a rollback 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自己的事务。
顺便重点再提一下预写日志,因为数据库的这种日志无比重要,普通的增删改查、数据还原、单库事务以及本文的分布式事务都离不开它,没有它绝大多数主流数据库的数据一致性根本无法实现。
到这里大家应该已经看到,相比单库事务,分布式事务控制更加复杂,而且开销极大。虽然一些高级开发框架如.net framework提供了较为强大丰富的类库如TransactionScope来简化开发分布式事务,但是建议能不用则不用,因为它被反映普遍存在性能问题和无意识的死锁问题。这种分布式事务的场景如果频繁出现,重新拆分系统合理规划架构才是正道。
总结:在大型web应用中如何保持事务这个话题被问得非常多,个人已经是不止一次被问到所维护的站点是如何实现事务的。在分布式多集群环境下,业务逻辑错综复杂,保证数据库完全可靠存储当然并不容易。但是web应用程序的一个典型特点是读多写少,牺牲极少的数据一致性获得系统的高可扩展性可维护性以及高性能,那么一点点的数据不准确在业务上完全可以容忍,何况我们有日志,后续还有很多补偿措施,甚至直接人工介入处理也未尝不可。
参考:
http://msdn.microsoft.com/en-us/library/ms191440.aspx
http://technet.microsoft.com/zh-cn/library/ms186259(v=SQL.105).aspx
http://www.cnblogs.com/CareySon/archive/2012/02/13/2349751.html
http://www.cnblogs.com/CareySon/archive/2012/02/14/2351149.html
浅析SQL Server实现分布式事务的两阶段提交协议2PC的更多相关文章
- 分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)
一. 事务的ACID 事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,当中,ACID是事务的基本特性. A是Atomicity,原子性.一个事务往往涉及到很多的子操作,原子性则保 ...
- sql server 锁与事务拨云见日(下)
在锁与事务系列里已经写完了上篇中篇,这次写完下篇.这个系列俺自认为是有条不紊的进行,但感觉锁与事务还是有多很细节没有讲到,温故而知新可以为师矣,也算是一次自我提高总结吧,也谢谢大伙的支持.在上一篇的末 ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 【转】SQL Server中的事务与锁
SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂 ...
- SQL Server中的事务日志管理(8/9):优化日志吞吐量
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】
概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...
- SQL Server 2008 数据库同步的两种方式 (发布、订阅)
参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步
- sql server 锁与事务拨云见日(中)
一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...
随机推荐
- MMS彩信字符集(字符编码)
彩信字符集在CharacterSets类中定义 android\frameworks\opt\telephony\src\java\com\google\android\mms\pdu\Charact ...
- AngularJS实现单页应用的原理——路由(Route)
AngularJS实现单页应用的原理——路由(Route) 路由:告诉你一个通往某个特定页面的途径 http://127.0.0.1/index.html#/start http://127.0.0. ...
- javascript实现字符串的截取
截取字符串方法有很多的,(不含根据传入参数截取成数组的split()方法)这里说的是子字符串,所以不说split()方法了. slice(),substr(),substring()一共三种方法,其中 ...
- Codeforces Round #347 (Div. 2) (练习)
A: 题意:找到[a, b]的最大公约数: 思路:相同时为本身,不同时为1. 套路:碰到水题别想太多: 猜想:两个相邻数,必有一奇一偶,如果偶数有因子3或者其他,奇数可不可能有相同的呢? 枚举一些数后 ...
- 找一个四位数,要求该四位数的四倍刚好是该四位数的反序。 即b1b2b3b4 * 4 = b4b3b2b1
找一个四位数,要求该四位数的四倍刚好是该四位数的反序. 即b1b2b3b4 * 4 = b4b3b2b1 解: 第一步,确认最末位 假设 b1b2b3b4 + b4b3b2b1 = [x0]x1x2x ...
- node开发
1. 国内使用npm安装某些插件的时候,偶尔会有网络问题,可以使用cnpm:(后续所有使用 npm 无法正常安装的,都改成 cnpm 试试) a. 首先使用 npm 安装 cnpm:npm insta ...
- PSP&进度条
11号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小 ...
- WInform关闭程序的几种方法以及区别。
1.this.Close(); 关闭窗体,如果关闭的是主窗体 程序结束.2.Application.Exit(); 退出所有的窗体但是如果有托管线程的话无法完全退出3.Application.Exit ...
- 如何安装win10+Red Hat Enterprise Linux双系统?
1,如何安装win10+Red Hat Enterprise Linux双系统???? 有很多人(没做过调查,可能就我自己想装吧)想要安装Red Hat Enterprise Linux系统,但是又不 ...
- [XAF] How to use the Allow/Deny permissions policy in the existing project
https://www.devexpress.com/Support/Center/Question/Details/T418166 Clear [C#] using DevExpress.Persi ...