
分布式事务
文章平均质量分 81
介绍各种分布式事务解决方案
Java识堂
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分布式事务解决方案:7种常见解决方案汇总
二阶段提交协议为了解决分布式事务的问题,出现了很多协议,如2PC(二阶段提交协议)、3PC(三阶段提交协议)在二阶段提交协议中有一个事务管理器和多个资源管理器。事务管理器分两阶段协调资源管理器。一阶段:事务管理器告诉资源管理器准备执行事务,并锁住需要的资源。当准备完成后,资源管理器向事务管理器报告已准备就绪。二阶段:如果所有资源管理器都准备成功,第二阶段事务管理器回要求所有的资源管理器执行提交操作。如果任一资源管理器在第一阶段返回准备失败,那么事务管理器回要求所有的资源管理器在第二阶段执行回滚操作.原创 2021-10-29 20:56:53 · 5216 阅读 · 0 评论 -
分布式事务解决方案:XA规范
XA规范二阶段提交协议是一个协议,而XA规范是X/Open 组织针对二阶段提交协议的实现做的规范。目前几乎所有的主流数据库都对XA规范提供了支持。这样做的好处是方便多个资源(如数据库,应用服务器,消息队列等)在同一个事务中访问。你可以类比JDBC我们这篇文章就以MySQL XA为例演示一下XA怎么玩?MySQL XA常用的命令如下命令解释XA START xid开启一个事务,并将事务置于ACTIVE状态,此后执行的SQL语句都将置于该事务中XA END xid将事务.原创 2021-09-16 20:43:07 · 1932 阅读 · 0 评论 -
分布式事务解决方案:Seata AT模式
Seata AT模式的demoSeata AT和XA模式的代码基本上一摸一样,就是开启数据源代理的时候不用在指定模式了,因为默认为AT模式我们以seata-at-tm项目向seata-at-rm项目转账为例演示一下seata at模式的使用,seata at模式更多的细节我们在后续的源码分析文章中介绍哈另外还需要在db_account_1和db_account_2库中建如下两张表,seata框架会用到CREATE TABLE `undo_log`( `id` big.原创 2021-09-21 13:39:50 · 407 阅读 · 0 评论 -
分布式事务解决方案:TCC设计思想及其可能遇到的问题
发现网上的一个关于TCC的分享很赞,转载一下。原文地址:https://www.sofastack.tech/blog/sofa-channel-4-retrospect/1、 Seata 的 TCC 模式1.1 服务化拆分下面我们就进入第一个主题,Seata 的 TCC 模式。蚂蚁金服早期是单系统架构,所有业务服务几乎都在少数几个系统中。随着业务的发展,业务越来越复杂,服务之间的耦合度也越来越高,故我们对系统进行了重构,服务按照功能进行解耦和垂直拆分。拆分之后所带来的问题就是一个业务活动原来只需.转载 2021-10-26 11:18:15 · 1746 阅读 · 0 评论 -
分布式事务解决方案:Seata TCC 模式
介绍开源的TCC框架有很多,比如,hmily,EasyTransaction,ByteTCC,TCC-Transaction等。其实我刚开始是用hmily学习tcc的,后续我也看了一下hmily的源码,但是,mily对各种异常流程的处理没有seata优雅。所以本篇就用seata tcc模式写一个转账demo,seata-tcc-tm项目向seata-tcc-rm项目转账seata-tcc-tmapplication.yamlserver: port: 30002spring: appl.原创 2021-09-21 16:28:19 · 719 阅读 · 0 评论 -
分布式事务解决方案:RocketMQ事务消息
用RocketMQ事务消息实现分布式事务RocketMQ实现分布式事务的流程如下producer向mq server发送一个半消息mq server将消息持久化成功后,向发送方确认消息已经发送成功,此时消息并不会被consumer消费producer开始执行本地事务逻辑producer根据本地事务执行结果向mq server发送二次确认,mq收到commit状态,将消息标记为可投递,consumer会消费该消息。mq收到rollback则删除半消息,consumer将不会消费该消息,如果收到.原创 2021-10-28 20:54:12 · 528 阅读 · 0 评论 -
seata源码解析:seata和spring是如何整合的?
介绍在seata低版本中,seata需要用户自己配置数据源代理,并且在resources目录下放2个文件,file.conf和registry.conf。其中file.conf配置了数据存储模式,registry.conf配置了注册中心的信息在最新的版本中,seata新增了一个seata-spring-boot-starter模块,让我们可以将数据存储模式和注册中心定义在application.yaml中,并且可以通过Enable注解开始数据源自动代理。因为我之前的Demo都是基于seata-sp.原创 2021-10-22 16:37:28 · 1391 阅读 · 0 评论 -
seata源码解析:只需一个注解就能开启分布式事务?
介绍给加了@GlobalTransactional,@GlobalLock,@GlobalLock注解的方法生成代理类protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { try { synchronized (PROXYED_SET) { // 已经处理过就不在处理 if (PROXYED_SET.contains(be.原创 2021-10-05 22:24:00 · 4217 阅读 · 0 评论 -
seata源码解析:TM RM 客户端的初始化过程
TM和RM初始化过程上一篇文章说过,在Spring启动的过程中就会就会初始化TM和RM,建立与TC的长连接。TM,RM,TC都是用netty来处理网络连接的,初始化netty客户端和服务端的过程也非常类似。本篇文章只分析TM的初始化过程,RM和TM复用了很多方法// TmNettyRemotingClientpublic void init() { // registry processor // 注册消息处理器 registerProcessor(); if (i.原创 2021-10-31 20:57:52 · 987 阅读 · 0 评论 -
seata源码解析:全局事务id是如何传递的?
Dubbo想在Dubbo应用之间进行参数传递,其实非常简单。通过Dubbo提供的隐式传递功能即可实现。使用方式如下所示。// A服务设置参数RpcContext.getContext().setAttachment("name", "小明");// A服务通过RPC调用B服务// B服务可以获取到A服务设置的参数RpcContext.getContext().getAttachment("name");所以我们可以把全局事务id放在RpcContext(rpc)中,然后在下游取出来。但.原创 2021-10-21 20:16:35 · 2076 阅读 · 0 评论 -
seata源码解析:seata-server启动时都做了哪些操作?
seata-server的主要功能有哪些?当我们启动一个seata-server的时候,只需要执行一下seata-server.sh脚本即可,这个脚本其实就是调用了io.seata.server.Server的main方法,我们来看一下这个main方法做了哪些操作?public class Server { public static void main(String[] args) throws IOException { // get port first, use to.原创 2021-10-05 23:25:30 · 582 阅读 · 0 评论 -
seata源码解析:seata server各种消息处理流程
介绍上一篇文章我们分析了seata-server端启动流程以及消息处理流程。这篇我们就来看第二个比较重要的内容,全局事务管理器是如何工作的?seata中有一个全局事务协调器DefaultCoordinator,它主要是处理来自RM和TM的请求来做相应的操作,但是实际的执行者并不是DefaultCoordinator,而是DefaultCoreDefaultCore的继承关系如下图,从继承图中我们可以看到其实Core类的实现类才是一个事务管理器。在seata中有4种事务管理模式,所以每种模式有一个具.原创 2021-10-21 21:31:54 · 552 阅读 · 0 评论 -
seata源码解析:事务状态及全局锁的存储
介绍public class Server { public static void main(String[] args) throws IOException { // 省略部分代码... // SessionHolder负责事务日志的持久化存储 // 设置存储模式,有三种可选类型,file,db,redis SessionHolder.init(parameterParser.getStoreMode()); .原创 2021-10-21 21:34:58 · 1806 阅读 · 0 评论 -
seata源码解析:分支事务的提交或回滚
介绍一个全局事务是由多个分支事务组成的,而ResourceManager就是用来管理分支事务的,主要有如下3个功能向TC注册资源接收TC的commit请求,提交分支事务接收TC的rollback请求,回滚分支事务因为Seata支持多种模式,每种模式都有对应的资源管理器,如TCCResourceManager,DataSourceManager,ResourceManagerXA等DefaultResourceManagerDefaultResourceManager包含了所有Resou.原创 2021-10-24 13:50:24 · 1680 阅读 · 0 评论 -
seata源码解析:seata AT模式是如何实现的?
AT模式RM在回滚时会先跟afterImage进行比较如果一致,则执行回滚sql如果不一致,再跟beforeImage进行比较2.1 如果一致没必要执行回滚sql了,数据已经恢复2.2 如果不一致说明出现脏数据,抛出异常,让人工处理AT模式是如何保证隔离性的?参考博客[1]https://chenjiayang.me/2019/06/29/seata-at/[2]https://www.beikejiedeliulangmao.top/middleware/seata/des.原创 2021-10-25 09:42:10 · 1097 阅读 · 0 评论 -
seata源码解析:seata是如何支持TCC模式的?
最常应用的模式TCC模式应该是企业应用最广的一种模式,主要分为2个阶段prepare,锁定相关的资源,保证事务的隔离性commit/rollback,根据全局事务的执行状态来执行分支事务的提交和回滚TCC模式不需要进行数据源代理,因为提交和回滚操作在业务层面都已经定义好了,不需要通过数据源代理生成对应的回滚操作当然事务的执行状态还是会通过seata server记录在global_table和branch_table表中通过TccActionInterceptor对方法进行增强当使用TC.原创 2021-10-05 23:54:26 · 641 阅读 · 0 评论