OceanBase 源码解读(四):事务的一生-阿里云开发者社区

开发者社区> 开发者小助手-bz2> 正文

OceanBase 源码解读(四):事务的一生

简介: 源码是 OceanBase 的“方向盘”,本系列主要围绕“源码解读”,通过文章阐述,帮助大家理清数据库的内在本质。此前,带你读源码第三篇《戳这里回顾:OceanBase 源码解读(三)分区的一生》为大家介绍了OceanBase 的存储层的相关内容。在第一节讲通信协议 obmp_query 时,跳过了事务控制的细节,本文为 OceanBase 数据库源码解读系列文章的第四篇,将主要为大家介绍事务的外部接口相关知识。
+关注继续查看

121.gif

源码是 OceanBase 的“方向盘”,本系列主要围绕“源码解读”,通过文章阐述,帮助大家理清数据库的内在本质。此前,带你读源码第三篇《戳这里回顾:OceanBase 源码解读(三)分区的一生》为大家介绍了OceanBase 的存储层的相关内容。在第一节讲通信协议 obmp_query 时,跳过了事务控制的细节,本文为 OceanBase 数据库源码解读系列文章的第四篇,将主要为大家介绍事务的外部接口相关知识。


事务的外部接口

1.1. 协议层对事务层的封装

协议层对事务层提供的原始接口进行了封装,源码位置:sql/ob_sql_trans_control.h,截图如下。这层封装维护了 TransState 状态,且便于 SQL 层调用,语句执行结束时在统一的位置根据 TransState 调用正确的事务接口,保证在任何异常状态下事务资源不泄露。
image.png

2.2. 原始的事务接口

原始的事务接口位于源码文件 storage/transaction/ob_trans_service.h,主要接口为:


  • start_trans & end_trans (参见截图)
  • start_stmt & end_stmt
  • start_participant & end_participant


它们分别对应事务、语句、语句内参与者(分区)的访问生命周期。start trans 开启事务后,返回一个 ObTransDesc 对象。该对象作为事务唯一标识,会被保存到 session 对象中,其他事务接口和后续语句执行都需要它,也常用于问题诊断。
image.gifimage.png

3.3. 分布式事务

开始执行前,根据语句涉及分区信息从 location cache 中获取主副本(leader)位置,选择对应类别的执行计划。一般的,一个 SQL 查询或 DML 会产生三类执行计划(ObPhyPlanType):

  • local 计划表示所有该语句执行需访问分区的 leader 都在本节点
  • remote 计划表示所有分区 leader 都在远程一个节点上
  • distributed 计划表示分区 leader 在多节点上的情况。


location cache 是一个整体架构上的重要组件,用于高效查找分区副本信息,它对外提供统一接口,屏蔽了很多分布式细节。它的主体实现位于 share/partition_table目录(参见截图),而源文件 sql/ob_sql_partition_location_cache.h 对它进行了封装,同时统一了虚拟表的处理。

事务控制调用往往要综合考虑多种因素:

  • 语句类型(是否只读)
  • 事务类型(是否自动提交,是否弱一致性读)
  • 当前事务状态和执行计划类型等

例如,本地计划自动提交,在本节点顺序执行 start_trans ➡︎ start_stmt ➡︎ start_participant ➡︎ end_participant ➡︎ end_stmt ➡︎ end trans;远程计划自动提交,上述接口都在远程节点执行。而对于分布式执行计划,start/end_stmt 在本节点执行,start/end_participant 在每个分区 leader 所在节点上执行。这组接口设计目的是在简化事务接口与分场景优化事务性能间取得一定的平衡。

image.gifimage.png

以上就是 OceanBase 事务的一生,在后续的源码解读第五篇我们将会为大家解析 OceanBase 数据库多租户架构的相关内容,敬请期待。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8661 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10493 0
【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案
转载:http://www.iteye.com/topic/1122740 1、预备知识 aop概念请参考【http://www.iteye.com/topic/1122401】和【http://jinnianshilongnian.
1350 0
【spring源码学习】spring配置的事务方式是REQUIRED,但业务层抛出TransactionRequiredException异常问题
(1)spring抛出异常的点:org.springframework.orm.jpa.EntityManagerFactoryUtils public static DataAccessException convertJpaAccessExceptionIfPossible(RuntimeE...
1011 0
【spring源码学习】spring的事务管理的源码解析
【一】spring事务管理(1)spring的事务管理,是基于aop动态代理实现的。对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transaction.interceptor.TransactionInterceptor。
1827 0
分布式事务中间件 Fescar—RM 模块源码解读
前言 在SOA、微服务架构流行的年代,许多复杂业务上需要支持多资源占用场景,而在分布式系统中因为某个资源不足而导致其它资源占用回滚的系统设计一直是个难点。我所在的团队也遇到了这个问题,为解决这个问题上,团队采用的是阿里开源的分布式中间件Fescar的解决方案,并详细了解了Fescar内部的工作原理,解决在使用Fescar中间件过程中的一些疑虑的地方,也为后续团队在继续使用该中间件奠定理论基础。
24297 0
Spring源码-声明式事务的运行原理(Spring Framework 5.2.10.RELEASE)
本篇内容分别对事务拦截器链的生成,代理对象的生成以及事务的运行过程,结合源码分析其原理
22 0
659
文章
0
问答
来源圈子
更多
蚂蚁OceanBase数据库团队,用于OceanBase技术原理、运维经验和案例分享、对外交流。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载