`
男人50
  • 浏览: 237258 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Mycat事务源码分析

 
阅读更多
Mycat的事务相关的代码逻辑,目前的实现方式如下:
用户会话Session中设定autocommit=false,开启一个事务过程,这个会话中随后的所有SQL语句进入事务模式,ServerConnection(前端连接)中有一个变量txInterrupted控制是否事务异常需要回滚 当某个SQL执行过程中发生错误,则设置txInterrupted=true,表明此事务需要回滚
当用户提交事务(commit指令)的时候,Session会检查事务回滚变量,若发现事务需要回滚,则取消Commit指令在相关节点上的执行过程,返回错误信息,Transaction need rollback,用户只能回滚事务,若所有节点都执行成功,则向每个节点发送Commit指令,事务结束。
从上面的逻辑来看,当前Mycat的事务是一种弱XA的事务,与XA事务相似的地方是,只有所有节点都执行成功(Prepare阶段都成功),才开始提交事务,与XA不同的是,在提交阶段,若某个节点宕机,没有手段让此事务在故障节点恢复以后继续执行,从实际的概率来说,这个概率也是很小很小的,因此,当前事务的方式还是能满足绝大数系统对事务的要求。
另外,Mycat当前若XA的事务模式,相对XA还是比较轻量级,性能更好,虽然如此,也不建议一个事务中存在跨多个节点的SQL操作问题,这样锁定的资源更多,并发性降低很多。
前端连接中关于事务标记txInterrupted的方法片段: public class ServerConnection extends FrontendConnection { /** * 设置是否需要中断当前事务 */ public void setTxInterrupt(String txInterrputMsg) { if (!autocommit && !txInterrupted) { txInterrupted = true; this.txInterrputMsg = txInterrputMsg; } } public boolean isTxInterrupted()
396
{ return txInterrupted; } /** * 提交事务 */ public void commit() { if (txInterrupted) { writeErrMessage(ErrorCode.ER_YES, "Transaction error, need to rollback."); } else { session.commit(); } } }
SQL出错时候设置事务回滚标志: public class SingleNodeHandler implements ResponseHandler, Terminatable, LoadDataResponseHandler { private void backConnectionErr(ErrorPacket errPkg, BackendConnection conn) { endRunning(); String errmgs = " errno:" + errPkg.errno + " " + new String(errPkg.message); LOGGER.warn("execute sql err :" + errmgs + " con:" + conn); session.releaseConnectionIfSafe(conn, LOGGER.isDebugEnabled(), false); ServerConnection source = session.getSource(); source.setTxInterrupt(errmgs);
397
errPkg.write(source); recycleResources(); } }
Session提交事务的关键代码: public class NonBlockingSession implements Session { public void commit() { final int initCount = target.size(); if (initCount <= 0) { ByteBuffer buffer = source.allocate(); buffer = source.writeToBuffer(OkPacket.OK, buffer); source.write(buffer); return; } else if (initCount == 1) { BackendConnection con = target.elements().nextElement(); commitHandler.commit(con); } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug("multi node commit to send ,total " + initCount); } multiNodeCoordinator.executeBatchNodeCmd(SQLCmdConstant.COMMIT_CMD); } }
398
}
1
0
分享到:
评论

相关推荐

    Mycat-Server-1.6(源码)

    Mycat-Server-1.6版本的源码分析,对于理解Mycat的工作原理、优化数据库访问性能以及定制化开发具有重要意义。 首先,我们来看看Mycat的核心功能。Mycat作为数据库中间件,主要承担以下任务: 1. **数据分片**:...

    Mycat从入门到精通视频教程

    Mycat从入门到精通视频教程目录介绍: ...第13课 Mycat源码分析 NIO源码分析 连接池源码分析 SQL路由模块分析 SQL执行模块分析 SQL汇聚模块分析 第14课 Mycat Catlet开发 Catlet原理 ShareJoin分析

    mycat从入门到跑路

    MySQL 主键问题 MySQL字段类型问题 MySQL Cache问题 MySQL常见误区 第11课 Mycat eye Mycat eye的规划方向 Mycat eye功能介绍 第12课 Mycat开发入门 Mycat项目编译与运行 Mycat主要模块分析 第13课 Mycat源码分析 ...

    Mycat2 v1.21-2022-4-7源码(Mycat2-1.21-2022-4-7.tar.gz)

    3. **源码结构分析** 源码解压后,我们通常会看到如下几个关键部分: - **Server模块**:Mycat的核心服务,包括启动、管理、监控等功能。 - **Schema模块**:负责数据的分片规则定义和数据路由。 - **SQL解析...

    mycat1.6jar包反编译的源码

    《深入解析mycat1.6源码:一次技术探索之旅》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大型分布式系统中,它实现了数据分片、读写分离、故障切换等功能,为高并发、大数据量的场景提供了优秀的解决...

    Mycat-Server-master 源码、可直接在eclipse中调试

    Eclipse是一款强大的Java开发工具,其内置的调试器能够帮助我们逐行分析代码,理解Mycat的工作原理。导入源码前,确保Eclipse已经安装了Maven插件,因为Mycat项目采用Maven进行构建管理。通过File &gt; Import &gt; Maven ...

    MyCat

    6. **源码分析**:对于开发者而言,了解 MyCat 的源码有助于深入理解其内部工作原理,如事务处理、SQL 解析、路由策略等,还可以根据需求进行二次开发。 7. **实战应用**:MyCat 在电商、社交、物联网等领域的大型...

    mycat入门到精通教程

    5. **Mycat事务处理** Mycat 支持 XA 两阶段提交协议,处理分布式事务。但需要注意,分布式事务可能导致性能下降,需要权衡事务一致性和系统性能。 6. **Mycat高可用** 通过部署多个Mycat Server节点,配合心跳...

    mycat从入门到精通

    13. **第13课Mycat源码分析**:深度剖析Mycat的NIO源码、连接池源码、SQL路由模块、SQL执行模块和SQL汇聚模块。 14. **第14课MycatCatlet开发**:讲解Catlet的工作原理和ShareJoin的分析方法。 #### 五、学习Mycat...

    关系型数据的分布式处理系统MyCAT

    - **数据分析平台**:对于需要频繁进行数据查询和分析的应用场景,MyCAT 的高效查询能力和数据分片功能能够极大地提高查询效率。 #### 4. MyCAT 的未来展望 随着大数据和云计算技术的不断发展,MyCAT 作为一种先进...

    mycatserver_mycatweb_zookeeper.zip

    zookeeper则是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。mycatweb则是mycat的可视化管理工具,方便用户监控和管理mycat...

    mycat-linux版

    Mycat的安装通常涉及下载源码、编译、配置等多个步骤,这要求对Linux命令行有深入的理解。 【描述】中提到的"mysql分库分表、读写分离"是Mycat的核心功能。分库分表是数据库垂直切分或水平切分的一种策略,目的是将...

    mycat对mysql数据库进行分库分表demo-mycat-demo-parent.zip

    6. **事务管理**:在分布式环境下,MyCat提供了全局事务支持,保证了跨库跨表操作的事务一致性。 7. **SQL兼容性**:MyCat尽可能保持对MySQL SQL语法的兼容,使得大部分应用可以直接迁移。 8. **配置文件**:MyCat...

    mycat权威指南

    在《Mycat权威指南》中,读者将了解到如何配置和管理Mycat服务器,包括安装、启动、停止以及日志分析等基础操作。此外,书中还会详细介绍Mycat的数据分片策略配置、SQL路由规则、事务处理机制、数据同步、性能优化等...

    MySQL MyCAT安装应用经典案例实战

    - **分布式事务问题**:当数据被切分到多个数据库时,如何保证事务的一致性成为一个难题。MyCAT提供了一种基于两阶段提交的方式,能够在一定程度上解决这个问题。 - **跨节点Join的问题**:由于数据分布在不同的...

    分布式事务书籍随书源码-distribute-transaction.zip

    分布式事务是现代软件系统...通过分析和学习这些源码,读者可以更深入地理解分布式事务的各种策略和实现细节,从而在实际项目中更好地应用和设计分布式事务。这不仅有助于提升技术水平,也有助于解决实际工作中的难题。

    Java思维导图xmind文件+导出图片

    基于Zookeeper Watcher 核心机制深入源码分析 Zookeeper集群升级、迁移 基于Zookeeper实现分布式服务器动态上下线感知 深入分析Zookeeper Zab协议及选举机制源码解读 Dubbo 使用Dubbo对单一应用服务化改造 ...

    分布式宠物商店源码

    6. 数据库分库分表:随着业务增长,单表数据量可能庞大,源码中可能实现了分库分表技术,如ShardingSphere或MyCAT,来解决数据库性能瓶颈。 7. 容器化与Docker:为了简化部署和管理,源码可能包含Docker配置,使得...

    对分库分表的一些想法

    7. **源码分析**:可能涉及一些开源工具的源码分析,帮助理解其内部实现机制,以便于自定义或优化。 8. **案例分析**:可能通过实际项目中的例子来说明如何设计和实施分库分表方案,以及从中吸取的经验教训。 在...

Global site tag (gtag.js) - Google Analytics