UpdateServer事务实现机制
UpdateServer(UPS) 是OceanBase的写入单点,一个集群中只有一台UPS服务器,所有的写都写入到这台机器。OceanBase采用基于静动态数据分离的机制,静态数据存储在静态数据服务器ChunkServer(CS)磁盘上,动态数据存储在UPS的内存中,导致一次读请求需要将静态和动态数据合并才能得到完整的数据,从而读也要访问UPS。OceanBase作为一个支持事务的分布式关系型数据库,UPS是实现事务的核心组件。单独看UPS,它是一个内存数据库,存储模型类似于LSM,写入操作写入内存,持久化通过写操作日志来保证,宕机后通过回放操作日志恢复数据,同时将对磁盘的随机写转换成顺序写。在事务的支持上,UPS实现Read Committed隔离级别。UPS在设计之初只考虑小事务,所以不需要传统关系型数据库中的UNDO,不支持像insert 1TB 这种大事务。操作日志中只有commit操作,没有rollback操作,所以操作日志更适合叫commitlog或者叫REDO LOG。实现上,读写互不影响,采用MVCC,写写冲突需要使用行锁。下面详述UPS的事务机制。
UPS的存储引擎使用的是一颗BTree,原理看这 和 这。这颗BTree是内存BTree,是一个聚簇索引,Key是表的主键,Value指向对这行的增量修改,如下图所示:

如图所示,对同一行的修改通过链表挂在BTree的Value上。对一行的每一次修改对应其中一个节点,TransID标识了提交这次修改的事务ID。当一个事务开启还没有提交时,事务的修改存在事务局部,事务提交的时候才会将事务的修改串到BTree的Value链表上。redo log buffer是一个内存block 的ring buffer,每个block 2MB。事务提交时,多个事务抢redo log buffer中的偏移和大小,抢在前的事务先提交,也就是说先串事务局部的修改链表到BTree的Value链表上。磁盘上,每个commitlog 64MB。
事务ID
和Oracle一样,事务ID是个时间戳。事务提交时抢到redo log buffer中的偏移时,事务ID根据当前时间和事务在redo log block的相对事务号来计算出事务ID,随后事务ID会被回填到事务局部链表中。
MVCC
由于OceanBase没有UNDO,MVCC相对来说实现比较简单。UPS全局维护一个publish_trans_id,表示最后一个成功提交的事务ID。每个事务开始时,获取publish_trans_id,相当于一个快照点,从而这个事务只能读取在这个事务之前开始的事务提交的修改,在这个事务开始之后开始的事务提交的修改时读不到的。读事务拿着事务开始时获取到的publish_trans_id,找到相应的行后,顺着链表读,只能读取TransID小于等于publish_trans_id的增量修改。每次刷redo log到磁盘后,会将这批redo log对应的最新的事务ID更新到publish_trans_id。写盘采用libaio+dio。由此看来,OceanBase的MVCC更像行级多版本。为了避免行链表过长,影响读的latency,在写的时候如果发现一行太长,会对链表进行合并。
写写冲突需要通过行锁来解决。采用两阶段锁,对需要修改的行加写锁,提交回滚的时候统一释放锁。
CheckPoint
由于OceanBase UPS实际上是一个内存数据库,存储模型类LSM,在内存不够时,会dump memtable到磁盘上形成SSTable,dump时会切换一个commitlog文件,这个commitlog的文件名就是OceanBase的checkpoint。在checkpoint上,传统关系型数据库比如MySQL在这点就比较好,以Innodb为例,checkpoint本质上是redo log的一个偏移量,由于它是个基于磁盘的存储引擎,数据是以Page进行组织的,只要Buffer Pool中的已经提交的事务修改的脏页刷新到磁盘了,那么相应的redo log就可以重用,checkpoint就可以向前推进。
UpdateServer事务实现机制的更多相关文章
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- Spring事务传播机制和数据库隔离级别
Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...
- spring 事务传播机制
spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...
- mybatis事务管理机制详解
1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...
- 数据库事务的隔离以及spring的事务传播机制
数据库的事务隔离: MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”RR(REPEATABLE READ). oracle默认的是提交读.RC 未提交读(READ UNCOMMITTE ...
- Spring事务管理机制的实现原理-动态代理
之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...
- Spring事务传播机制与隔离级别(转)
Spring事务传播机制与隔离级别 博客分类: Spring 转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...
随机推荐
- 【Java并发编程】:生产者—消费者模型
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据“姓 ...
- PullToRefreshListView 进入界面不能立即显示刷新控件的bug 解决方案
1.首先定位到PullToRefreshListView.java这个文件 2.找到onRefreshing(final boolean doScroll)方法 @Override protected ...
- golang笔记(1)-数据库查询结果映射至结构体
通用的映射模式 query:="select id,name from user where id=?" //单个结构体ret:=&Activity{} DbClient( ...
- Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...
- 理解Spring定时任务的fixedRate和fixedDelay
用过 Spring 的 @EnableScheduling 的都知道,我们用三种形式来部署计划任务,即 @Scheduled 注解的 fixedRate(fixedRateString), fixe ...
- 10.Set 和 Map 数据结构
Set 和 Map 数据结构 Set 和 Map 数据结构 Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来 ...
- Git报错:error: cannot open .git/FETCH_HEAD: Read-only file system
Git:git pull时报错 error: cannot open .git/FETCH_HEAD: Read-only file system 查看该文件: 未在网上找到解决办法,重启服务器就好了 ...
- VB里的 dim是什么意思?
Dim为Dimension的缩写,后面加上所需变量的名字As为变量指定类型程序运行时,Dim语句就根据变量类型为变量分配内存空间
- SQL查询出某字段不等于某值的行(其中有为NULL的字段)
表1如下:TBD1100 TBD1101 TBD1102------------------------------------------ 1001 水果 ...
- Java基础教程(13)--包
为了使类型更易于查找,避免命名冲突和访问控制,我们应该使用包来对自己定义的类型进行管理.这里说的类型可以是类.接口.枚举和注解(枚举和注解的内容会在后续教程中介绍).使用包来管理我们的代码,有以下 ...