在SQL本地事务、asp.net事务、DTC中初识分布式事务,今天对分布式事务做一次理论学习。
分布式事务简介
对于事务而言,数据库只是其中的一种表现新式。事实上,数据间更新协调配合的概念对于其他数据源也是适用的。由于拥有了针对每个数据源的软件层,所有这些数据源都可以参与到事务当中。这些软件层被称为RM(Resource Manager)。
在现代应用程序中,事务的管理通常会由一个名为事务管理器(Transaction Manager,即TM)的软件层完成。在使用TM的时候,运用事务的应用程序由以下职责:
请求创建事务。
指定在事务中涉及的数据源。在这一步,数据源RM会像TM注册自己.接着,我们就在事务中对数据源被占用的部分进行交互了。
在事务过程中为每个数据源完成数据的更新。
在更新完成之后通知TM。
TM负责协调配合RM所做的工作。协调的目的在于保证数据的完整性。
分布式事务意味着在多个RM中更新数据并不影响事务的ACID属性。为此,TM的实现通常都基于两阶段提交验证算法(2PC)。
在第一个阶段,应用程序登记每个数据源并执行数据更新的请求。TM通知每个RM参与分布式事务;接着,每个RM对自己的事务执行一个本地的事务;就在事务要提交之前,TM会与RM进行交互,以获取更新是否成功了,RM都可以表决事务是成功还是失败。
如果至少一个RM投票表决事务失败,那么TM将会告知所有参与的RM:该分布式事务已经失败了。然而,每个RM都必须取消它的事务并且将数据回滚到初始状态。如果所有的RM一致投票表决事务成功,那么事务就成功了,那么事务就成功了,并且所有RM都会被告知提交数据的改动。
由于分布式事务需要在事务的各个参与方进行多次通信,所以是一种开销巨大的操作。一次尽可能的使用本地事务。