分布式事务的两级提交

在项目ITOO2.0之前,分布式事务一直是讨论的主流问题之一。对于什么是事务,以及事务的ACDI特性,我就不在这里费口舌了~

简单介绍一下分布式事务:分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。

其中最经典的例子就是跨行转账问题,各大银行之间的系统一定都是分布式系统,银行之间的业务操作也一定要执行分布式事务。没有分布式事务,谁还敢去银行存钱?

为什么要用它:分布式事务旨在协助在分布式环境中跨异类的事务识别资源的事务。在分布式系统的支持下,应用程序可以将不同的活动合并为一个事务单元。因为分布式事务跨多个数据库资源,故强制 ACID 属性维护所有资源上的数据一致性十分重要。

当时我们只是对事务做到了理解和简单的实现,分布式事务到底是什么,怎么用还不太清楚。

实现项目的时候,我们只是先现在底层封装了一系列操作数据库的方法,然后定义了一个接口,里边有VS自带的SaveChanges方法。在BLL层每个逻辑块结束时再对SaveChanges方法进行调用。在严格意义上来讲,我个人觉得这其实并不属于分布式事务,只是一个简单的事务。

关于这个问题,师哥们提出了两级提交这个概念,也叫两阶段提交。这个“两”应该也不是绝对的,只是理解起来比较容易。两级提交是分布式事务实现的关键。

两级提交

两级提交的过程涉及到协调者和参与者。协调者可以看做成事务的发起者,同时也是事务的一个参与者。对于一个分布式事务来说,一个事务是涉及到多个参与者的。

阶段一:首先,协调者在自身节点的日志中写入一条日志记录,然后所有参与者发送消息prepare T,询问这些参与者(包括自身),是否能够提交这个事务;参与者在接受到这个prepare T 消息以后,会根据自身的情况,进行事务的预处理,如果参与者能够提交该事务,则会将日志写入磁盘,并返回给协调者一个ready T信息,同时自身进入预提交状态;如果不能提交该事务,则记录日志,并返回一个not
commit T信息给协调者,同时撤销在自身上所做的数据库改。这个参与者能够推迟发送响应的时间,但最终还是需要发送的。

阶段二:协调者要收集参与者的结果。

返回信息为ready T,则协调者会将commit T日志写入磁盘,并向所有参与者发送一个commit T信息,提交该事务;

返回信息为not commit T,则该事务不能被提交,协调者会将abort T 记录到日志中,并向所有参与者发送一个abort T 信息,让所有参与者撤销在自身上所有的预操作;

若协调者迟迟未收到某个参与者发来的信息,则认为该参与者发送了一个VOTE_ABORT信息--决定中止,从而取消该事务的执行。

如图:

异常处理:

操作日志是保证提交成功与否的信息关键,当参与者commit T时,若其发生了死机,则可以通过日志进行恢复,询问协调者是否提交成功。

但若协调者发出commit T后发生死机,该事务就会处于一个未知状态。这时就需要数据库管理员的介入,防止数据库进入一个不一致的状态。当然,如果所有节点或者网络的异常最终都会恢复,那么这个问题就不存在了,协调者和参与者最终会重启,其他节点也最终也会收到commit T的信息。

下面给大家分享一个System.TransactionScope类(使代码块成为事务代码)实现分布式事务的一个Demo:

//若dal.Insert提交失败,则不能继续执行;若employeeDAL.Insert(emp)提交失败,则整体提交失败,dal.Insert也不能真正执行。
using (TransactionScope ts = new(TransactionScope())
{
    DepartmentDAL dal = new DepartmentDAL()//公寓DAL;
    dal.Insert("公寓1号");

    EmployeeDAL employeeDAL = new EmployeeDAL();//员工DAL
    Employee emp = new Employee();//员工类
    employeeDAL.Insert(emp);

    ts.Complete();//提交
}

分布式事务的使用十分重要,而且随着分布式系统的兴起,它的应用范围也会更广。在我们的项目中,如何做好、实现好还需要继续分析和实践探索。总之,在分布式的路程上,我们还需要走的路很长~

时间: 2024-11-09 14:17:52

分布式事务的两级提交的相关文章

分布式事务:两段式提交(最终一致性)

[MySQL如何实现分布式事务?] http://www.linuxidc.com/Linux/2013-10/91925.htm Innodb存储引擎支持XA事务,通过XA事务可以支持分布式事务的实现.分布式事务指的是允许多个独立的事务资源(transac tional resources)参与一个全局的事务中.事务资源通常是关系型数据库系统,也可以是其它类型的资源. 全局事务要求在其中所有参与的事务要么全部提交,要么全部回滚,这对于事务原有的ACID要求又有了提高.另外,在使用分布式事务时候

OceanBase分布式事务以及两阶段提交实现详细设计

目前OceanBase中还存在updaeserver单点,下一步的开发任务是使得OB支持多点写入,支持多个UPS(及updateserver). 其中难点是如何设计两阶段提交的失败恢复以及多机的快照读写,和同事讨论后,形成一个可以work的简单设计版本,记录在此. 为分布式事务的两阶段提交细化具体流程,拟采用primary record方式实现失败恢复,即在进入commit阶段之前,先写入primary record 记录当前事务的状态(commit/rollback).Primary reco

对分布式事务及两阶段提交、三阶段提交的理解

转载至:http://www.cnblogs.com/binyue/p/3678390.html,最近学习需要,先转载方便用用来强化加深印象 一.分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上. (1)什么是数据一致性 在数据有多份副本的情况下,如果网络.服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败.这就造成各个副本之间的数据不一致,数据内容冲突. 造成事实上的数据不一致. (2)CAP定

MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布式事务,将事务的提交分成了两个阶段:也就是2PC (tow phase commit),XA协议就是通过将事务的提交分为两个阶段来实现分布式事务. 两阶段: 1)prepare 阶段 事务管理器向所有涉及到的数据库服务器发出prepare"准备提交"请求,数据库收到请求后执行数据修改和日志

关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口.XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁.XA之所以需要引入事务管理器是因为,在分布式系统中,从理论上讲(参考Fischer等的论文),两台机器理论上无法达到一致的状态,需要引入一

分布式事务(两阶段提交)模型详解

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt369 这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来. 在上一节事务的编程模型里面,主要说明了三种编程模型,一般情况下,我们都接触的是单一资源的事务,也就是单独对一个数据库进行操作.如果需要跨多个资源保证事务一致性 举个例子:在ATM机取钱的时候,需

分布式事务之两阶段提交

一.二阶段提交协议 一般分为协调器C和若干事务执行者Si两种角色:    当执行某一事务T的所有站点Si都通知C事务执行完成,C即启动二阶段提交协议.    (1) 首先C向所有Si发<prepare>消息(C先将<prepare>消息写到本机日志) ,Si收到<prepare>消息后,根据本机T的执行情况,如果成功返回<ready T>,不成功返回<abort T>.(返回前都应把要返回的消息写到日志里)     (2) C收集完所有Si的返回

关于分布式事务、两阶段提交协议、三阶提交协议

随着大型网站的各种高并发访问.海量数据处理等场景越来越多,如何实现网站的高可用.易伸缩.可扩展.安全等目标就显得越来越重要. 为了解决这样一系列问题,大型网站的架构也在不断发展.提高大型网站的高可用架构,不得不提的就是分布式.在<分布式系统的一致性探讨>一文中主要介绍了分布式系统中存在的一致性问题.本文将简单介绍如何有效的解决分布式的一致性问题,其中包括什么是分布式事务,二阶段提交和三阶段提交. 分布式一致性回顾 在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(repli

分布式事务、两阶段提交协议、三阶提交协议

为了解决这种分布式一致性问题,前人在性能和数据一致性的反反复复权衡过程中总结了许多典型的协议和算法.其中比较著名的有二阶提交协议(Two Phase Commitment Protocol).三阶提交协议(Three Phase Commitment Protocol)和Paxos算法. 一.分布式事务 分布式事务是指会涉及到操作多个数据库的事务.其实就是将对同一库事务的概念扩大到了对多个库的事务.目的是为了保证分布式系统中的数据一致性.分布式事务处理的关键是必须有一种方法可以知道事务在任何地方