分布式事务如何拆解成单机事务

这段时间一直在思考分布式事务的实现,一开始的思路总是停留在应用层面上,后来经过查看相关资料才知道,要支持分布式事务得需要数据库的支持,也就还是回到了数据库层面,另外在Java里面结合javax.sql扩展包,使用两段提交协议能轻松支持分布式事务。

后来自己结合之前做过的一些项目,发现原来之前实现的功能已经利用消息队列把分布式事务拆解成单机事务了,虽然实时性可能没有那么强,但是正常情况下,这种思路还是比较好的一种解决方案。只是以前不知道这个概念,但是却是实现了这个功能。

关于分布式事务的拆解的分析,案例还是上篇文章的案例,由于上篇文章主要写的重点是突出事务与并发的关系,这边文章主要想写分布式事务如何拆解成单机事务来执行,场景还是使用上篇文章的场景。

  • A系统处理一个事务后修改订单状态
  • 通过ActiveMQ通知B系统,B系统收到通知后启动一个事务来处理跟订单相关的信息,再通过ActiveMQ告知A系统
  • A系统再启动一个事务修改订单状态
  • 假设订单状态正常由第一步骤到第三步骤的状态变化为pending---finish

假设上篇文章的bug我们已经解决,那这个流程就是一个典型的分布式事务拆解成单机事务的例子,A系统里面分别启动了两个事务来修改订单状态,第二个事务启动的条件是B系统的事务执行完毕并收到确认消息之后。

然而这个流程可能有很多细节要注意,如:

  • B系统的事务执行失败,A系统如何重新启动整个流程
  • B系统如何保证幂等性
  • A系统的第二个事务启动失败,A系统如何重新启动整个流程

以上问题都是很好解决的我们只需在应用程面多加一些异常处理机制即可保证整个流程执行顺畅。在B系统里面可以根据转态或者另外建立一张消息表以保证接口的幂等性。

时间: 2024-12-27 19:50:30

分布式事务如何拆解成单机事务的相关文章

搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocketmq-store),消费者从这里取得消息. rocketmq-client:提供发送.接受消息的客户端API. rocketmq-namesrv:NameServer,类似于Zookeeper,这里保存着消息的TopicName,队列等运行时的元信息.(有点NameNode的味道) rocketm

从本地事务到分布式事务到微服务下事务

从本地事务到分布式事务到微服务下事务 一.传统本地事务 传统单服务器,单关系型数据库下事务比较简单,完全可用很简单的实现ACID,实际中我们实现一个业务时只需要:开启一个事务-操作数据库-提交/回滚这个事务,这样就完美的实现了一次事务操作,更简单点我们通常会通过spring集成事务直接指定在哪些服务什么样的方法执行什么样的事务即可,更甚至我们业务实现基本都忽略了事务,具体图如下: 二.传统分布式事务 在传统一服务,一个关系数据库架构基础上,随着访问量的增大,单机很明显已满足不了现状,于是我们顺其

深入单机事务

事务的ACDI1.原子性(一个事务要么同时成功,要同时失败)Bob给了Smith 100元重点:原子性只记录了undo日志,可以回滚到之前的版本.2.一致性(对事务加了一把锁)核心:can(happen before)3.隔离性(以性能为理由,对一致性的破坏)1.序列化读写排他锁:(单位时间内只有一个事务拥有他)读写锁:2. (可重复读:(读锁不能被写锁升级)读读并行)3.(读已提交:(读锁可以被写锁升级)读读并行,读写并行(写读还不能))4.(读未提交:(写加锁,读不加锁)读读并行,读写并行,

如何把单体式应用拆解成微服务?【下】

热评博文:<如何设计出优美的Web API?>,现阅读量超 2300,小伙伴们不要错过哦! 紧接昨天的上篇<如何把单体式应用拆解成微服务?[上]>,今天我们一起来看看具体的拆解场景: 场景1:数据库表外键引用关系 如果单体式应用中两个功能模块存在数据引用关系,那我们在拆解微服务时如何消除这种外键引用关系呢?首先,停?外键引?:然后,改成通过RESTful HTTP API?式获取原先外键关联的信息.如下图,改造前Payment数据库表中的记录通过外键引用Order,代码层面通常会借

数据库事务系列-MySQL跨行事务模型

说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务.虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比较上层.好在周边都是MySQL内核神级人物,在他们的熏陶下多多少少对MySQL的一些基本知识有一些零碎的记录和模糊的认识,这些基础对于今天整理理解MySQL跨行事务模型非常重要.更重要的,有很多不解的地方也可以向大神请教. MySQL事务模型在网上也有很多的介绍,在

数据库事务及其EF中如何处理事务

一.基础知识 1)         使用事务级别ReadUnCommited 会产生脏读现像,意味着读取到的为UnCommited(未提交)的数据.怎么理解呢?在使用该隔离级别的事务开始后.更新了数据库某一行的数据,但是事务的工作量比较大,后续还有一大堆代码还没执行完呢.不巧的是有个哥们过来读数据了,这个时候读到的就是未提交的值,如果后继工作一切正常,也没什么影响.一旦后面的代码执行中出错,就会产生不一致的错误,适用于对事务极度自信的情况下,特点为可读不可改.关于不可改需解释一下,MS SQL中

spring笔记--事务管理之声明式事务

事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使用事务: 作为一个受欢迎的企业应用框架,Spring在不同的事务管理API上定义了一个抽象层,而开发时不必了解底层的事务管理API,就可以使用Spring的事务管理机制. Spring既支持编程式的事务管理,也支持声明式的事务管理,大多数情况我们选择后者. 编程式事务管理:将事务管理代码嵌入到业务代

全面分析 Spring 的编程式事务管理及声明式事务管理

转自:http://www.open-open.com/lib/view/open1414310646012.html 关于本教程 本教程将深切讲授 Spring 庞杂而丁壮夜的事务治理功用,包括编程式事务和声明式事务.经由进程对本教程的进修,您将可以理解 Spring 事务治理的实质,并无邪运用之. 先决前提 本教程假定您已掌控了 Java 根蒂根抵常识,并对 Spring 有一定意见.您还需求具有根抵的事务治理的常识,好比:事务的界说,隔离级其他概念,等等.本文将直接行使这些概念而不做具体正

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带