说说分布式事务

分布式事务

分布式事务说的就是一个事务的两个或者多个操作不是在一个数据库中进行的,而是在多个数据库中执行。
这个时候,如何保证事务操作的原子性和一致性?

举个支付的例子,支付进行买东西。事务由两个行为组成,我的购买商品数据表数据+1,支付金额表数据-1。
如果这两个都是在同一库中,没啥问题。

try {
    事务开始
    购买商品数据表数据+1
    支付金额表数据-1
    事务结束
} catch 事务失败 {
    事务回滚
}

但是这两个表是在两个库中,那么就用到二阶段提交了

二阶段提交

二阶段提交(2PC)增加了事务处理器和事务执行者的角色。由事务处理器来进行整个事务的处理。主要流程如下面的图

prepare

当开始事务调用的时候,事务处理器向事务执行者(有可能是数据库本身支持)发出命令,事务执行者进行prepare操作。

当所有事务执行者都完成了prepare操作,就进行下一步行为。

如果有一个事务执行者在执行prepare的时候失败了,那么通知事务处理器,事务处理器再通知所有的事务执行者执行回滚操作。

commit

当所有事务执行者都prepare成功以后,事务处理器会再次发送commit请求给事务执行者,所有事务执行者进行commit处理。

当所有commit处理都成功了,那么事务执行结束。

如果有一个事务执行者的commit处理不成功,这个时候就要通知事务处理器,事务处理器通知所有的事务执行者执行回滚(abort)操作。

但是两阶段提交的诟病就是在于性能问题。比如由于执行链比较长,锁定资源的时间也变长了。所以在高性能的系统中都会避免使用二阶段提交。

使用消息系统避免分布式事务

这种方法是文章如何用消息系统避免分布式事务?中提到的方法。

首先这种方法必须在产品上有所妥协。比如支付过程,在支付操作之后,并不是立即返回告知用户你是否成功,并且扣除金额(当然如果消息队列通畅的情况下看起来是立即返回的)。

而是在支付的过程中,先恭喜你获取物品成功,然后获取物品成功后通知消息队列,由消息队列再进行扣除金额的操作。

当然消息队列有可能操作失败,操作失败以后由于有凭证,可以进行重试操作。

最终支付成功后,再进行消息确认,从而保证消息一致性。

时间: 2024-10-27 18:11:02

说说分布式事务的相关文章

GTS for DRDS分布式事务的实现理解

GTS介绍 全局事务服务(Global Transaction Service,简称 GTS)是一款高性能.高可靠.接入简单的分布式事务中间件,用于解决分布式环境下的数据一致性问题. 一个完整的业务往往需要调用多个子业务或服务,随着业务的不断增多,涉及的服务及数据也越来越多,越来越复杂.传统的系统难以支撑,出现了应用和数据库等的分布式系统.分布式系统又带来了数据一致性的问题,从而产生了分布式事务. 分布式事务是指事务发起者.资源管理器.事务协调者及资源分别位于不同的分布式系统的不同节点之上. G

破解世界性技术难题! GTS让分布式事务简单高效

近日,2017云栖大会·深圳峰会如期举行,多项阿里云新产品对外发布.在企业级互联网架构分会场,来自阿里中间件(Aliware)的技术专家及合作伙伴,为现场参会嘉宾带来最新的传统IT架构到企业级互联网架构跨越式升级.实现互联网转型的产品及解决方案.其中高级技术专家姜宇在分享中带来的Aliware新产品-全局事务服务(Global Transaction Service ,简称GTS),在分布式事务处理上带来的高性能和技术创新令到场参会的各路技术专家眼前一亮. Aliware新成员-全局事务服务GT

Java分布式事务概念与实现示例

分布式|概念|示例   在java中有如下三种事务, 简单的JDBC级的事务 JTA - 在EJB环境下,用户得到事务并进行控制 CMP - 完全由容器控制事务,用户通过Bean配置文件来定义事务行为 二三种都支持分布式事务,但只支持Java环境下的分布式事务. 下面讨论如何在Java程序里实现分布式事务,即在同一个事务里访问多个数据源.实际上就是如何使用JTA. 这里假设使用Oracle数据库,使用WebLogic部署应用,所要做的是如下几步: 1. 配置 1.1 确认数据库支持分布式事务 -

MS SQLServer OLEDB分布式事务无法启动的一般解决方案

server|sqlserver|分布式|解决 本文属spanzhang原创,其blog地址为:http://blog.csdn.net/spanzhang.引用或转贴请注明出处,谢谢!! 服务器: 消息 7391,级别 16,状态 1,行 6该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务.[OLE/DB provider returned message: 不能在指定的事务处理器中获得新事务.]------------------------------

c# 分布式事务以及MSDTC

# 分布式事务 以及MSDTC.这里解决的是这个问题: # 分布式事务 以及MSDTC 这里解决的是这个问题: 如果一个请求需要执行多个操作: {     int iGet=MethodA();     if(iGet>0){         MethodB();     } } 现有两个方法: int MethodA(){} bool MethodB(){} 有可能出现A执行成功,但是B不成功,需要回滚,这就需要MSDTC的系统事务,亦为分布式事务. 其主要功能为使代码块成为事务性代码,在Sy

关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试

server|分布式 关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试 MS DTC Report 1.      MS DTC 背景 2.      MSDTC 测试目的 3.      MSDTC 测试环境 3.1            本次验证测试环境: 3.2            环境配置 3.3            验证MSDTC 3.4            创建验证用表 4.      Linked Server测试 5.     

分布式查询和分布式事务

分布式 Microsoft SQL Server 允许创建与称为链接服务器的 OLE DB 数据源的链接.在链接到 OLE DB 数据源之后,可以: 从 OLE DB 数据源引用行集,作为 Transact-SQL 语句中的表. 将命令传递给 OLE DB 数据源,并包含结果行集,作为 Transact-SQL 语句中的表. 每个分布式查询都可以引用多个链接的服务器,而且可以对每个链接的服务器分别执行更新或读取操作.单个分布式查询可以对某些链接的服务器执行读取操作,并且对其它链接的服务器执行更新

分布式事务

分布式      总体来看,如果所有数据的修改仅依靠单个数据源就能完成,则这个事务就相当简单了.然而,随着商业需求的日益增加,应用程序变得越来越复杂,经常需要访问多个数据库,这些数据库通常分布在不同的地方,这就是分布式事务.分布式事务修改的数据存储在多个或多种类型的数据源中,这些数据源分布在多台机器上,甚至更复杂的情况.    设想有一个事务,要求数据变化发生在两个分离的数据库中,仍然要求所有的ACID特性测试能够满足.基本的事务处理不能满足要求,因为如果其中一个数据库服务器失败,无法确保另外一

ADO.NET 系列 quiz 2 关于分布式事务

ado|分布式 问题:关于分布式事务的例子: 数据库A 和数据库B 上各有一个bank 表 ( 实际情况下A 和 B 分别在不同的机器上,不同类型的数据库(支持dtc))表结构如下BankAccount, Amount A 数据库中的记录:A 1000 B 数据库中的数据B 1000 为了测试方便,没有用 COM+,而是直接在 web service 中测试.代码如下: <WebMethod(TransactionOption:=EnterpriseServices.TransactionOpt

支付宝分布式事务测试方案简介

什么是分布式事务 传统的基于数据库本地事务的解决方案只能保障单个服务的一次处理具备原子性.隔离性.一致性与持久性,但无法保障多个分布服务间处理的一致性.因此,我们必须建立一套分布式服务处理之间的协调机制,保障分布式服务处理的原子性.隔离性.一致性与持久性. 支付宝为什么需要分布式事务 基于SOA架构,整个支付宝系统会拆分成一系列独立开发.自包含.自主运行的业务服务,并将这些服务通过各种机制灵活地组装成最终用户所需要的产品与解决方案. 在多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条