OceanBase1.0的分布式事务讲解
OceanBase分布式技术架构分析

OceanBase分布式技术架构分析目录OceanBase作为金融级分布式数据库一直备受瞩目 (3)1. 分布式存储&事务 (3)2. 分布式查询 (13)3. 经验&思考 (15)OceanBase作为金融级分布式数据库一直备受瞩目OceanBaseOceanBase 1.0项目从2013年初开始做总体设计,2014年开始编码、测试,2015年底正式上线并无缝迁移部分集团MySQL业务,直到2016年中才正式上线蚂蚁核心业务,包括会员视图、花呗、账务,等等,最后“丝般柔顺”地通过了2016年双十一大考。
从技术架构的角度看,一个分布式数据库主要就是两个部分:一个部分是怎么做存储,怎么做事务;另外一个部分是怎么做查询。
首先我们看第一个部分,主要是三个关键点:可扩展、高可用以及低成本,它们代表了OceanBase的核心技术优势。
1.分布式存储&事务第一我们怎么理解数据,如何把数据划分开来从而分布到多台服务器?这个问题其实传统关系数据库已经帮我们解决好了。
无论是Oracle还是MySQL,都支持一个叫做两级分区表的概念。
大部分业务都可以按两个维度划分数据:一个维度是时间,数据是按照时间顺序生成的;另外一个维度,对于互联网业务来讲,往往就是用户。
不同的用户生成不同的数据,不同用户之间的数据相关度比较低,而同一个用户的数据往往会被同时访问。
图1 OceanBase数据分布如图1,通过时间和业务主键两个维度将表格划分为P1~P8总共8个分区。
OceanBase 跟传统数据库不一样的地方在哪里呢?传统数据库所有的分区只能在一台服务器,而OceanBase每个分区可以分布到不同的服务器。
从数据模型的角度看,OceanBase可以被认为是传统的数据库分区表在多机的实现。
对于常见的分布式系统,要么采用哈希分区,要么采用范围分区。
OceanBase的数据划分方案和这些系统有较大的差别,通过两级分区表,我们可以把不同的用户,以及在不同时间点生成的数据全部融合到统一的表格里面。
分布式事务执行流程

分布式事务执行流程一、什么是分布式事务。
分布式事务就是在分布式系统中,涉及到多个数据源或者多个服务的事务操作。
比如说,你在网上购物,下单的时候要扣减库存、增加订单记录,库存系统和订单系统可能是不同的服务,这就是一个分布式事务。
就像一群小伙伴一起完成一件大事,每个小伙伴负责不同的部分,但要保证整体的事情顺利完成。
二、事务开始。
当一个分布式事务要启动的时候,就像吹响了集合的号角。
系统要先确定有哪些操作是这个事务里面要做的。
这就好比我们要出去旅游,先确定好要去哪些景点,是先去看山还是先去玩水。
在这个阶段,各个相关的服务或者数据源都要准备好,就像小伙伴们都要整理好自己的背包,带上自己该带的东西。
三、执行操作。
然后就开始真正的执行啦。
每个参与的部分都要按照自己的任务去做。
比如说库存系统要减少商品的数量,订单系统要生成订单。
这时候可能会遇到各种各样的情况呢。
就像小伙伴们在旅途中可能会遇到道路不好走,或者天气不好。
在分布式事务里,可能会遇到网络延迟、资源不足等问题。
但是每个部分都要尽量把自己的事情做好,就像小伙伴们不能因为一点小困难就放弃旅行的计划。
四、协调和沟通。
在分布式事务执行的过程中,各个部分之间还需要不断地协调和沟通。
这就像小伙伴们在旅途中要随时交流,比如前面的路不通了,后面的小伙伴要知道,然后一起商量怎么办。
在分布式事务里,可能一个服务执行成功了,但是另一个服务出现了问题,这时候就需要一种机制来告诉其他的服务,让大家一起决定是继续尝试还是回滚操作。
这种协调机制就像是团队里的小队长,要负责把大家的情况汇总起来,然后做出决策。
五、事务的提交或者回滚。
最后到了决定整个事务命运的时候啦。
如果所有的操作都顺利完成了,就像小伙伴们顺利地游玩了所有的景点,那么就可以提交这个事务,就像在旅行结束后大家都很开心地说这次旅行很成功。
但是如果有一个或者多个操作失败了,那就像旅途中有人受伤或者遇到了不可抗力无法继续前行,这时候就需要回滚事务。
OceanBase分布式事务以及两阶段提交实现具体设计

OceanBase分布式事务以及两阶段提交实现具体设计眼下OceanBase中还存在updaeserver单点,下⼀步的开发任务是使得OB⽀持多点写⼊,⽀持多个UPS(及updateserver)。
当中难点是怎样设计两阶段提交的失败恢复以及多机的快照读写,和同事讨论后,形成⼀个能够work的简单设计版本号,记录在此。
为分布式事务的两阶段提交细化详细流程,拟採⽤primary record⽅式实现失败恢复,即在进⼊commit阶段之前。
先写⼊primary record 记录当前事务的状态(commit/rollback)。
Primary record起到⼀个全局⽇志的作⽤。
可供全部參与者读取。
须要注意的是,为了保证⼀致性,读写primary record 都须要加锁,须要使⽤select update语句。
採⽤primary record ⽅式的优势是,协调者在整个事务处理过程中能够是⽆状态的,不须要记录操作⽇志。
宕机重新启动后不须要做失败处理。
⽽參与者宕机重新启动或超时失败后,能够⽆需与协调者以及其它參与者通信,实现独⽴恢复,实现简单。
其缺点是每次分布式事务中都会记录⼀次primary record,会添加写⼊数据量以及事务延迟。
将两阶段提交的流程分为下⾯⼦流程描写叙述:Ø 协调者处理流程Ø 參与者处理流程Ø 未决事务处理流程为⽀持长事务、长事务中长语句以及两阶段提交,⽂档还简单描写叙述了对UPS⽇志的改动⽬标。
最后。
⽂档简单记录了组内讨论实现多UPS快照读写的⼀些讨论结果。
1. 两阶段提交具体流程Ø 协调者处理流程协调者处理流程指的是開始⼀个分布式事务直到事务结束或者失败。
处理期间。
协调者须要维护分布式事务的相关状态和信息,如參与者列表,事务运⾏计划,事务提交的时间戳,事务的primary record 主键等等,这些信息不须要持久化存储,协调者宕机后。
分布式事务的概念与原理

分布式事务的概念与原理好的,那我们就开始聊聊分布式事务的概念与原理吧。
你有没有想过,在一个超级大的公司里,不同部门就像不同的小系统一样,它们有时候得一起干一件大事儿。
比如说举办一场超级盛大的公司年会,这就像是一个事务。
场地部门要负责找场地,餐饮部门要准备美食,表演部门要安排节目,这些部门的工作就像是分布式系统里不同的服务或者数据库操作。
如果场地找好了,但是餐饮没准备好,那这个年会肯定就乱套了,就像分布式事务里一部分成功一部分失败是不行的。
那什么是分布式事务呢?简单来说,就是在分布式系统里,涉及到多个节点(就像刚刚说的不同部门)操作的时候,要保证这些操作要么全都成功,要么全都失败,就像年会要么完美举办,要么干脆不办。
现在来说说它的原理吧。
想象一下,你和你的小伙伴们一起做一个超级大的拼图,这个拼图就是一个分布式事务。
你们每个人负责一部分拼图块(每个拼图块就像是一个子事务)。
在开始拼之前,得有个计划,这就好比是分布式事务里的事务协调器。
首先,事务协调器会告诉每个小伙伴(各个子事务):“嘿,我们要开始拼这个大拼图啦,大家准备好。
”这就是事务开始的信号。
然后呢,每个小伙伴就开始做自己的那部分拼图工作。
在这个过程中,小伙伴们(子事务)会时不时地向事务协调器报告自己的进展情况,就像“我已经拼好这块儿了”或者“我这块儿有点问题”。
这个过程就像是子事务的执行和状态反馈。
假如有个小伙伴发现自己那块拼图块丢了(子事务执行失败),那他就会赶紧告诉事务协调器。
事务协调器收到这个消息后,就会像个超级英雄一样,它得通知其他小伙伴:“哎呀,咱们这个拼图出问题了,大家先停一下,把已经拼好的部分拆了吧,我们重新来。
”这就是回滚操作。
所有小伙伴就得按照协调器说的,把自己拼好的部分还原,保证整个拼图(分布式事务)回到最初的状态。
如果每个小伙伴都顺利地完成了自己的拼图块(所有子事务都执行成功),那事务协调器就会开心地宣布:“太棒了,我们的大拼图完成啦!”这就表示分布式事务成功提交了。
oceanbase底层原理

oceanbase底层原理OceanBase是阿里巴巴集团自主研发的一款分布式数据库系统,具有高可用、高可靠、高扩展性等特点。
它的底层原理涉及到分布式存储、分布式事务、分布式索引等多个方面。
下面将从这些方面详细介绍OceanBase的底层原理。
1. 分布式存储OceanBase采用了分布式存储架构,将数据分散存储在多个节点上,提高了数据的可靠性和可用性。
它使用了一种称为“Sharding”的技术,将数据按照一定的规则分割成多个片段,并将这些片段分布在不同的节点上。
这种方式可以使得数据的访问更加高效,同时也能够提高系统的容错性。
2. 分布式事务在分布式场景下,保证数据的一致性是一个重要的问题。
OceanBase 通过使用多副本和分布式事务来解决这个问题。
多副本可以保证数据的可靠性,即使某个节点出现故障,系统仍然能够正常运行。
而分布式事务则可以保证多个节点上的数据操作是一致的,避免了数据的冲突和不一致。
3. 分布式索引索引是数据库系统中非常重要的一个组成部分,它可以提高查询效率。
OceanBase的底层原理中也包含了分布式索引的设计。
它采用了一种称为“DolphinDB”的技术,将索引数据分布在多个节点上,并通过一定的算法将数据定位到正确的节点上进行查询。
这样可以使得索引的访问更加高效,并且能够支持海量数据的快速检索。
4. 分布式调度OceanBase的底层原理中还包括了分布式调度的设计。
它通过一种称为“OceanScheduler”的技术,将任务分配给不同的节点进行执行。
这样可以使得系统的负载均衡,提高系统的稳定性和性能。
5. 分布式计算除了存储和索引,OceanBase的底层原理中还包括了分布式计算的设计。
它通过一种称为“OceanCompute”的技术,将计算任务分发到不同的节点上进行并行计算。
这样可以提高计算效率,同时也能够支持大规模数据的处理。
总结起来,OceanBase的底层原理涉及到分布式存储、分布式事务、分布式索引、分布式调度和分布式计算等多个方面。
oceanbase概述

OceanBase概述一、介绍OceanBase是一款分布式关系型数据库管理系统(RDBMS),由中国阿里巴巴集团自主研发并维护。
它致力于为全球用户提供高性能、高可用、高可靠的数据存储服务,以满足企业级应用对数据的存储和管理需求。
OceanBase的出现,填补了我国在数据库领域的空白,标志着我国在数据库核心技术上的重大突破。
二、发展历程OceanBase的发展历程可以追溯到2010年,当时阿里巴巴集团为了解决“双十一”购物狂欢节期间的大规模数据处理问题,开始研发一款全新的数据库系统。
经过多年的发展和完善,OceanBase已经成为了全球领先的分布式关系型数据库管理系统之一。
三、技术特点1. 分布式架构:OceanBase采用分布式架构,可以横向扩展,支持海量数据的存储和处理。
2. 高可用性:OceanBase具有高可用性,通过数据复制和故障切换技术,确保数据的可靠性和业务的连续性。
3. 高性能:OceanBase具有高性能,通过优化的数据存储和查询算法,提供快速的数据处理能力。
4. 多租户支持:OceanBase支持多租户模式,可以为多个用户提供独立的数据空间,保证数据的安全性和隐私性。
四、应用场景OceanBase广泛应用于各种场景,包括电商、金融、物流、教育、医疗等领域。
例如,它可以作为电商平台的后台数据库,支持每秒处理数百万笔交易;也可以作为金融机构的数据中心,存储和处理大量的金融交易数据;还可以作为物流公司的订单管理系统,支持实时的订单处理和追踪。
五、未来展望随着大数据和云计算技术的发展,OceanBase将继续发挥其分布式数据库的优势,提供更加强大和灵活的数据存储和处理能力。
同时,OceanBase也将积极探索新的技术领域,如人工智能、物联网等,以推动数据库技术的进一步发展。
六、总结OceanBase作为我国自主研发的分布式关系型数据库管理系统,不仅在技术上具有领先优势,而且在实际应用中也展现出了强大的能力。
OceanBase1.0的分布式事务讲解

盘的原子性操作和硬件本身有关,磁盘一般是一个512 字节的块写入是原子的,SSD 一般是4KB 的块写入是原子的。
用一个数据结构的例子说明这种原子性实现机制。
struct Balance {int accountA;int accountB;};Balance * x =new Balance();上面是C++ 的结构体,表示了两个账户 A 和 B 的余额。
如果从 A 转账5 元给B,对应的C++ 代码如下:x->accountA -= 5;x->accountB += 5;上面的代码不是原子的,在两条语句中间,如果另一个线程读取accountA 和accountB 的值,会发现转账操作只执行了一半。
如果使用下面的代码,就可以保证无论什么时候读取,都不会读到转账执行了一半的情况:Balance * tmp = new Balance();tmp->accountA = x->accountA - 5;tmp->accountB = x->accountB + 5;x = tmp;操作的生效时间是x = tmp;语句,单一变量的赋值操作是原子的,保证了整个转账操作是原子的。
使用日志实现原子性(Atomicity)上面基于原子性操作的实现方法在数据结构中很常用,但是现在数据库系统都是使用日志技术(log)实现原子性(Atomicity),因为日志技术解决原子性的方法更灵活,还能同时解决了事务的持久性(Durability)需求,而且比直接持久化数据有更好的性能,所以几乎所有的数据库系统都采用了日志技术(log),甚至还包括文件系统、队列系统等。
使用log 时,先把整个事务的操作编码成连续的日志信息,再把日志信息写入持久化设备,当日志成功写入后,就是保证事务原子性成功的时机。
以上面的转账操作为例,编码出的日志信息如下:<accountA, balance, -5>, <accountB,, balance, +5>当上面的信息持久化成功后,数据库系统再会修改两个帐户的数据,而且帐户数据本身持久化到硬盘的时机可以延后到任意时刻,因为即使数据没有持久化前就宕机了,系统重启后还是可以从log 中将上面的转账操作恢复出来。
oceanbase分布式事务原理

oceanbase分布式事务原理在分布式环境中,一个事务可能需要跨多个分布式节点进行操作,这就导致了分布式事务的一致性和可靠性难以保证。
为了解决这个问题,2PC协议被提出。
2PC协议分为两个阶段:准备阶段和提交阶段。
在准备阶段,事务的协调者向所有参与者发送prepare请求,参与者执行事务,并将undo和redo信息记录在本地日志中。
当参与者执行成功后,将给协调者发送ack消息。
如果有任何一个参与者执行失败,会向协调者发送abort消息。
使用2PC协议可以确保分布式事务的一致性,但是这种协议在性能上存在一定的问题。
首先是协议需要等待所有参与者的响应,如果有任何一个参与者响应超时或失败,可能会导致整个事务的阻塞。
其次是协议的同步通信机制导致整个过程的延迟比较大。
为了解决这些问题,OceanBase引入了基于Paxos协议的复制机制来实现分布式事务的原子性和持久性。
Paxos是一种基于一致性算法的分布式协议,它可以实现在不可靠的网络环境下,通过多个节点之间的消息交换来达成一致的共识。
在OceanBase中,Paxos协议用于将数据复制到多个节点,并确保在分布式事务中的数据访问和更新按照指定的原子操作执行。
具体来说,当一个事务需要在多个节点上进行操作时,OceanBase使用Paxos协议来协调不同节点上的操作顺序以及数据的复制。
每个节点都可以作为一个副本,每个副本都有自己的唯一标识,通过Paxos协议选举一个节点作为leader,负责协调事务的执行。
使用Paxos协议可以保证分布式事务的原子性和可靠性,同时也解决了2PC协议在性能上的问题。
因为Paxos协议可以容忍少数节点的故障和延迟,不需要等待所有节点的响应。
综上所述,OceanBase采用了两阶段提交和基于Paxos协议的复制机制来实现分布式事务的一致性和可靠性。
这些机制可以保证分布式环境下的数据访问和更新的原子性、一致性和持久性,并且在性能上有一定的优势。
oceanbase 级别定义

oceanbase 级别定义
OceanBase是阿里巴巴开发的一种分布式关系型数据库管理系统。
在OceanBase中,有几种不同的级别定义,包括事务级别、隔离级别和日志级别。
首先,让我们来看看事务级别。
在OceanBase中,事务级别定义了事务的隔离程度和并发控制的方式。
OceanBase支持四种事务级别,分别是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
每种级别都有不同的特点和适用场景,可以根据实际业务需求进行选择。
其次,隔离级别是指在并发执行的事务中,一个事务对数据的修改在另一个事务中是否可见。
OceanBase支持的隔离级别包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
不同的隔离级别对并发控制有不同的要求和影响,可以根据业务需求和性能要求进行选择。
最后,日志级别是指数据库系统记录和输出日志的详细程度。
在OceanBase中,日志级别包括ERROR、WARN、INFO和DEBUG。
不同的日志级别对系统性能和故障排查有不同的影响,可以根据实际
情况进行配置和调整。
总的来说,OceanBase的级别定义涵盖了事务级别、隔离级别
和日志级别,通过合理的配置和调整可以满足不同业务场景的需求,并提高系统的性能和稳定性。
OceanBase云平台产品说明书

OceanBase 云平台(产品名称) 声明 产品版本:V1.0.0(软件版本)文档版本:20150122(发布日期)OBCP 实验指导手册|产品版本:V 0.8.8声明蚂蚁集团版权所有 © 2020 ,并保留一切权利。
未经蚂蚁集团事先书面许可,任何单位、公司或个人不得擅自摘抄、翻译、复制本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明及其他蚂蚁集团相关的商标均为蚂蚁集团所有。
本文档涉及的第三方的注册商标,依法由权利人所有。
免责声明由于产品版本升级、调整或其他原因,本文档内容有可能变更。
蚂蚁集团保留在没有任何通知或者提示下对本文档的内容进行修改的权利,并在蚂蚁集团授权通道中不时发布更新后的用户文档。
您应当实时关注用户文档的版本变更并通过蚂蚁集团授权渠道下载、获取最新版的用户文档。
如因文档使用不当造成的直接或间接损失,本公司不承担任何责任。
目录声明 (I)1.实验概述 (1)2.实验准备 (3)2.1.实验架构 (3)2.2.设备需求 (3)3.实验:OB分布式架构高级技术 (4)3.1.OB负载均衡 (4)4.实验:OB存储引擎高级技术 (21)4.1.内存管理 (21)4.2.合并与转储 (27)5.实验:OB SQL引擎高级技术 (31)5.1.SQL 引擎 (31)5.2.SQL 执行计划 (38)5.3.执行计划缓存 (47)6.实验:OB SQL调优 (54)6.1.分区 (54)6.2.索引、局部索引与全局索引 (60)6.3.Hint (65)6.4.SQL 性能监控 (68)7.实验:OB分布式事务高级技术 (72)7.1.全局快照与分布式一致性读 (72)8.实验:OBProxy 使用与运维 (78)8.1.OBProxy基础运维 (78)8.2.OBProxy 路由配置与运维 (80)9.实验:OB备份与恢复 (84)9.1.(逻辑)备份与恢复 (84)9.2.(物理)备份与恢复 (91)10.实验:OB 运维、监控 (98)10.1.用户管理 (98)10.2.日志管理 (103)10.3.日常运维操作 (108)10.4.数据监控 (113)10.5.灾难恢复 (117)3.实验:OB分布式架构高级技术3.1.OB负载均衡3.1.1.实验目的在这一章节的实验中,学员能够体验和理解OB负载均衡的主要特性,如下: ²表组特性下的资源分配²自动负载均衡²集群扩容²租户扩容²PrimaryZone 的设置3.1.2.实验准备进行负载均衡实验,每个 OB ZONE 中至少有两台 observer.步骤 1:完成基础的OB集群搭建,每个 Zone 先只有一个 observer3.1.3.实验步骤3.1.3.1 表组特性下的资源分配步骤 1:租户 obcp_t1下创建表分区mysql登录obcp_t1 租户,选择 test数据库use testcreate table t1 (c1 int,c2 int ) ;create table t2 (c1 int,c2 int ) primary_zone='zone2' ;create table t3 (c1 int,c2 int ) partition by hash (c1) partitions 3;查看表分区副本分布情况的统计:mysql> select tenant.tenant_name, zone, svr_ip,casewhen role=1 then 'leader'when role=2 then 'follower'else NULLend as role,count(1) as partition_cntfrom__all_virtual_meta_table meta inner join __all_tenant tenant onmeta.tenant_id=tenant.tenant_idinner join __all_virtual_table tab on meta.tenant_id=tab.tenant_id andmeta.table_id=tab.table_idwheretenant.tenant_id=<obcp_t1 ID>group by tenant.tenant_name,zone, svr_ip, 4order by tenant.tenant_name, zone, svr_ip, role desc;注: 实验环境中,创建的表分区的分布开始未必如以上这样均衡的, 负载均衡需要一些时间,待系统检测并自动分布。
oceanbase分布式事务原理

oceanbase分布式事务原理OceanBase是阿里巴巴集团自主研发的一款高可用分布式关系型数据库系统。
在高并发情况下,传统的单机数据库往往面临性能瓶颈,通过使用OceanBase可以水平扩展数据库,提高系统的可用性和性能。
分布式事务是OceanBase的核心功能之一,下面将详细介绍OceanBase分布式事务的原理。
一、分布式事务概述分布式事务是指涉及多个独立的数据库、服务或者应用程序的事务被同时提交或者回滚。
在分布式系统中,由于存在网络延迟、节点故障等问题,保证多节点之间的一致性成为了一项重大挑战。
OceanBase通过实现分布式事务来解决这一问题。
二、分布式事务的实现原理1.两阶段提交协议在准备阶段,事务协调者(即主节点)向所有参与者(即从节点)发送准备请求,并等待参与者确认准备就绪。
如果所有参与者都回复可准备,事务协调者则进入提交阶段;否则,事务协调者发送中止请求,使所有参与者回滚。
在提交阶段,事务协调者向所有参与者发送提交请求,并等待参与者提交完成的回复。
如果所有参与者都回复已提交,事务协调者将提交事务;否则,事务协调者发送中止请求,使所有参与者回滚。
2.分布式锁为了保证在分布式环境中的数据一致性,OceanBase引入了分布式锁机制来协调并发事务的执行。
分布式锁通过在事务操作之前,获取对应的资源锁,来保证只有一个事务能够修改资源的数据。
3.分布式日志在分布式事务中,日志起到了至关重要的作用。
OceanBase通过使用分布式日志系统,将所有节点上的事务操作进行异步复制和持久化,从而保证数据的一致性和可恢复性。
在分布式事务中,每个参与者通过向事务协调者发送消息来完成自己的操作。
事务协调者将这些操作写入分布式日志,并在事务提交时,将操作应用到各参与者的本地存储中。
这样即使一些节点发生故障,可以通过重新应用日志快速恢复数据。
三、分布式事务的优化策略为了提高分布式事务的性能和效率,OceanBase采用了如下优化策略:1. 并发控制:OceanBase通过合理地使用锁机制,来减少锁冲突的概率,提高并发性能。
分布式事务的实现方式与原理

分布式事务的实现方式与原理分布式事务的实现方式与原理主要包括以下几个方面:1. 全局唯一值:在消息传递过程中,需要有一个全局唯一值来标识每一次事务。
这个全局唯一值需要贯穿整个调用链路,以保证事务的唯一性和可追溯性。
2. 可靠服务:在分布式系统中,需要有一个可靠的服务来负责协调和管理事务。
这个可靠服务可以是一个中心化的服务,也可以是一个去中心化的服务。
在事务过程中,所有的操作都需要经过这个可靠服务进行协调和确认。
3. 消息队列:在分布式事务中,消息队列是一个重要的组成部分。
通过消息队列,可以将事务的操作消息发送给相关的系统或服务,并等待它们确认或回滚。
同时,消息队列也可以保证消息的有序性和可靠性。
4. 业务操作:在分布式事务中,业务操作可以分布在不同的系统或服务中。
这些系统或服务通过消息队列接收事务操作消息,并进行相应的业务处理。
业务操作需要遵循原子性、一致性、隔离性和持久性的原则,以保证事务的可靠性和一致性。
5. 回滚机制:在分布式事务中,如果某个系统或服务的业务操作失败了,就需要进行回滚操作,撤销已经完成的事务操作。
回滚机制需要根据具体的业务场景和需求进行设计,保证回滚操作的正确性和可靠性。
6. 补偿机制:与回滚机制类似,补偿机制也是为了解决分布式事务中的一致性问题。
当某个系统或服务的业务操作失败后,可以通过补偿机制来保证整个事务的一致性。
补偿机制可以通过反向操作、撤销操作等方式实现。
总的来说,分布式事务的实现方式与原理主要涉及到全局唯一值、可靠服务、消息队列、业务操作、回滚机制和补偿机制等方面。
通过这些技术和机制的结合,可以实现在分布式系统中的高可用、高并发、高性能的事务处理。
分布式事务理解

分布式事务理解
分布式事务是指将一个业务流程中涉及到多个不同的数据资源或
数据库的事务分成多个子事务来执行,且每个子事务都有自己的原子性、一致性、隔离性和持久性特性,同时还保证最终的结果符合整个
业务流程的一致性要求的一种事务处理机制。
在分布式事务中,不同的子事务可能会涉及多个不同的系统和节点,这些节点之间需要通过网络进行通信和协调,以确保整个业务流
程的正确执行。
同时,分布式事务还需要考虑到系统的可用性、性能
和安全等方面的要求,以保证整个业务流程的可靠性和高效性。
一般来说,分布式事务有两种实现方式,即基于两阶段提交协议
的方式和基于补偿事务模式的方式。
在基于两阶段提交协议的方式中,所有涉及到的子事务都需要向一个中心协调者发送请求,然后由协调
者来控制所有子事务的执行过程,最终确定整个业务流程的执行结果。
而在基于补偿事务模式的方式中,则是通过在每个子事务中实现事务
的撤销和回滚机制,来保证整个业务流程的一致性和正确性。
总之,分布式事务是一种非常重要的分布式系统技术,它可以帮
助我们实现在多个系统和节点之间执行复杂业务流程时的事务一致性
保证,同时还可以提高系统的可用性和性能。
什么是分布式事务以及有哪些解决方案?

什么是分布式事务以及有哪些解决⽅案?1、什么是分布式事务?答:指⼀次⼤的操作由不同的⼩操作组成的,这些⼩的操作分布在不同的服务器上,分布式事务需要保证这些⼩操作要么全部成功,要么全部失败。
从本质上来说,分布式事务就是为了保证不同数据库的数据⼀致性。
2、分布式事务产⽣的原因?2.1 数据库分库分表 当数据库单表数据达到千万级别,就要考虑分库分表,那么就会从原来的⼀个数据库变成多个数据库。
例如如果⼀个操作即操作了01库,⼜操作了02库,⽽且⼜要保证数据的⼀致性,那么就要⽤到分布式事务。
2.2 应⽤SOA化 所谓的SOA化,就是业务的服务化。
例如电商平台下单操作就会产⽣调⽤库存服务扣减库存和订单服务更新订单数据,那么就会设计到订单数据库和库存数据库,为了保证数据的⼀致性,就需要⽤到分布式事务。
总结:其实上⾯两种场景,归根到底是要操作多数据库,并且要保证数据的⼀致性,⽽产⽣的分布式事务的。
3、分布式事务解决⽅案3.1 两阶段提交(2PC) XA是⼀个分布式事务协议,由Tuxedo提出。
XA中⼤致分为两部分:事务管理器和本地资源管理器。
其中本地资源管理器往往由数据库实现,⽐如Oracle、Mysql等数据库都实现了XA接⼝,⽽事务管理器作为全局的调度者,负责各个本地资源的提交回滚。
XA实现分布式事务的原理如下:总结 ⼆阶段提交看起来确实能够提供原⼦性的操作,但是它存在⼏个缺点:1、同步阻塞问题:执⾏过程中,所有参与节点都是事务阻塞型的。
当参与者占有公共资源时,其他第三⽅节点访问公共资源不得不处于阻塞状态。
2、单点故障:由于(事务管理器)协调者的重要性,⼀旦协调者发⽣故障。
(本地资源管理器)参与者会⼀直阻塞下去。
尤其在第⼆阶段,协调者发⽣故障,那么所有的参与者还都处于锁定事务资源的状态中,⽽⽆法继续完成事务操作。
(如果是协调者挂掉,可以重新选举⼀个协调者,但是⽆法解决因为协调者宕机导致的参与者处于阻塞状态的问题)3、数据不⼀致:在⼆阶段提交的阶段⼆中,当协调者向参与者发送commit请求之后,发⽣了局部⽹络异常或者在发送commit请求过程中协调者发⽣了故障,这会导致只有⼀部分参与者接收到了commit请求。
oceanbase的基本概念

oceanbase的基本概念OceanBase是由阿里巴巴集团自主研发的一款分布式数据库系统。
它基于分布式并行计算以及分布式事务引擎,具备高性能、高可扩展性和高可靠性等特点。
以下是OceanBase的几个基本概念:1. 分区:OceanBase将数据按照特定的规则进行分区存储,每个分区包含一部分数据。
分区可以根据业务需求进行灵活的调整和扩展。
2. 分片:OceanBase将每个分区进一步划分为多个片,每个片包含一部分数据。
每个分片会在多个节点上进行复制,以实现数据的冗余和容错。
3. 副本:每个分片的数据会在多个节点上进行复制,这些副本可以提供冗余和容错。
OceanBase使用多副本的方式保证数据的高可靠性。
4. 节点:OceanBase系统由多个节点组成,每个节点都是一个物理服务器或虚拟机。
每个节点负责存储和计算一部分数据。
5. 元数据:OceanBase使用元数据来描述和管理数据库的结构和状态。
元数据包括分区信息、分片信息、数据分布信息等。
6. 分布式事务:OceanBase支持分布式事务,可以保证在跨多个节点的操作中,数据的一致性和可靠性。
它使用了基于多版本并发控制(MVCC)的机制来解决并发访问的问题。
7. 弹性扩展:OceanBase具备高可扩展性,可以根据数据量和负载的增长进行水平扩展。
通过增加节点和数据分片,可以实现系统的水平扩展,以支持更大规模的数据存储和处理。
总之,OceanBase是一个高性能、高可扩展性和高可靠性的分布式数据库系统,它通过分区、分片、副本和分布式事务等机制,实现了数据的分布式存储、容错和并发访问。
分布式事务的原理和应用场景

分布式事务的原理和应用场景说到分布式事务,大家可能会想:这不就是几个不同地方的系统,要一起做个交易,然后各自保证自己的一份责任,不出事就好了嘛!嗯,是这么个意思,简单说就是让大家在不同地方的系统都能“互相协调、互相理解”,以确保交易的成功完成。
你可以把它想象成几个团队在做一项合作任务,每个队员都有自己的分工,大家一起完成任务,但谁也不能掉链子。
不然整个任务就没法顺利完成,大家都会被“拖后腿”。
这种情况,简单来说就是分布式事务。
咱得搞明白“事务”到底是个啥。
事务,顾名思义,就是一件事。
我们做一件事情,通常都会有“开始”和“结束”这两端。
就像你做一道数学题,开始时拿起笔,结束时交卷。
做任何事情都得讲究个“原子性”。
什么意思呢?就是要么全部完成,要么全部不做。
假设你正在买东西,选好了,付款了,但突然卡死了,钱已经扣了但东西没发。
这个时候,交易就不符合“原子性”了。
分布式事务就像是这道数学题的“保姆”,确保整个交易过程中每一步都顺利,不会中途掉链子。
我们为什么要用分布式事务呢?很简单,现在的应用不再是单一的系统了。
你想想,一家公司要卖东西,支付、库存、订单、物流等等这些环节,几乎每个都在不同的系统里。
想要它们协同工作,保持一致性,靠一个单独的系统是绝对不行的。
这时候,如果系统出了问题,怎么办?换句话说,当数据分散在不同的地方,如何确保一个“全局一致性”?这就好比你开个派对,大家都带了自己独特的菜,大家怎么才能不发生“菜品掉链子”的情况呢?这就是分布式事务要解决的问题。
说到这里,咱们再聊聊分布式事务是怎么解决这些问题的。
大家应该都听说过“二阶段提交协议”吧?它就像是分布式事务中的“指挥家”,协调各个系统的工作。
在第一阶段,每个参与方都会先锁定自己的资源,准备好开始执行操作;然后,在第二阶段,指挥家会一声令下,所有参与方开始执行。
如果有任何一方出错,那就会启动回滚操作,撤销之前的所有动作,确保大家都“干干净净”地收场。
oceanbase使用指南

oceanbase使用指南OceanBase是阿里巴巴集团自主研发的分布式关系型数据库,广泛应用于大规模数据存储和处理场景。
本文将为大家介绍OceanBase 的使用指南,帮助读者更好地理解和运用这一强大的数据库系统。
一、OceanBase简介OceanBase是一种分布式关系型数据库,具备高可用、高性能和高扩展性的特点。
它采用了分布式架构和多副本数据存储方式,能够处理海量数据,并提供快速的数据访问和查询能力。
OceanBase支持SQL语言,与传统关系型数据库相比,具有更好的水平扩展性和容错能力。
二、OceanBase的安装与部署1. 硬件要求:OceanBase需要一定的服务器资源,建议使用高性能的服务器或云主机来部署。
2. 系统要求:OceanBase支持Linux和Windows操作系统,根据自己的需求选择适合的操作系统版本。
3. 下载安装包:从官方网站下载OceanBase的安装包,并解压到指定目录。
4. 配置文件修改:根据实际需求修改配置文件,包括网络配置、存储配置等。
5. 启动服务:执行启动脚本,启动OceanBase的各个组件服务。
三、OceanBase的基本操作1. 数据库创建与删除:使用SQL语句创建和删除数据库,语法与传统关系型数据库相似。
2. 表的创建与删除:使用SQL语句创建和删除表,指定表的字段、数据类型和约束。
3. 数据的插入与查询:使用SQL语句插入和查询数据,可以根据条件过滤和排序结果。
4. 数据的更新与删除:使用SQL语句更新和删除数据,可以根据条件指定要更新或删除的数据。
5. 事务管理:OceanBase支持事务操作,可以通过设置事务隔离级别和使用事务语句来实现数据一致性和并发控制。
6. 索引的创建与优化:为表的字段创建索引,可以提高查询性能和数据访问效率。
7. 数据备份与恢复:OceanBase提供了备份和恢复的功能,可以定期备份数据以防止数据丢失,并在需要时恢复数据。
oceanbase分布式事务原理(一)

oceanbase分布式事务原理(一)分布式事务简介什么是分布式事务•分布式事务是指在分布式系统中,涉及多个事务参与者(通常是不同的数据库实例)的一组原子操作,这些原子操作要么全部成功要么全部失败。
•分布式事务的关键是保证事务的一致性、可靠性和隔离性。
传统的单机事务存在的问题•单机事务只需要处理本地事务的原子性,不涉及不同数据库的一致性,因此相对简单。
•在分布式系统中,不同数据库的数据往往分布在不同的节点上,由于网络通信、节点故障等原因,使得跨节点的事务管理变得复杂。
分布式事务的实现方式1. 两阶段提交(2PC)•2PC是最经典、最常用的分布式事务实现方式之一。
•2PC由协调者(Coordinator)和参与者(Participant)组成,通过发送预提交和提交指令来实现事务的提交。
2. 补偿事务(TCC)•TCC是一种补偿型的分布式事务模型。
•TCC事务的核心是使用try-confirm-cancel三个阶段来实现事务的可靠执行。
•TCC相比2PC,更为灵活,在业务逻辑的实现上更加自由。
3. 柔性事务(Saga)•Saga是一种长事务解决方案,将一个大的事务拆分成一系列小的、独立的局部事务。
•每个局部事务执行成功后,向协调者发送通知,如果发生故障,则回滚局部事务。
OceanBase分布式事务•OceanBase是一个开源的分布式关系型数据库系统,支持分布式事务。
•OceanBase分布式事务采用了自研的事务协议OC-Trans,具有高性能、高可用、高稳定性等优势。
•OC-Trans采用了基于副本的多阶段提交协议,避免了单点故障,并提供了良好的容错能力。
结论•针对分布式事务的需求,不同的实现方式具有不同的优势和适用场景。
•OceanBase使用自研的OC-Trans协议实现了高性能、高可用的分布式事务功能,为分布式数据库应用提供了可靠的支持。
以上是对于OceanBase分布式事务的简要介绍和相关原理解释,分布式事务是一个庞大的主题,希望能帮助读者初步了解该领域的基本概念和解决方案。
oceanbase使用指南

oceanbase使用指南OceanBase使用指南导语:OceanBase是阿里巴巴自主研发的一款分布式关系型数据库管理系统。
它具有高可用、高性能、高扩展性的特点,能够满足大规模数据存储和处理的需求。
本文将为您详细介绍OceanBase的使用指南,帮助您更好地了解和使用这一强大的数据库系统。
一、OceanBase的安装与配置1. 安装准备在安装OceanBase之前,需要确保服务器满足一定的硬件和软件要求,例如CPU、内存、硬盘空间等。
同时,还需要安装相应的操作系统和依赖软件,如CentOS、GCC、OpenSSL等。
2. 下载安装包进入阿里云官网或OceanBase官方网站,下载最新的OceanBase 安装包。
下载完成后,将安装包解压到指定目录。
3. 配置集群在集群中选择一台服务器作为主节点,其他服务器作为从节点。
编辑配置文件,设置相关参数,如节点IP、端口号、存储路径等。
根据集群规模的不同,可以设置不同的参数。
4. 启动集群按照指定顺序依次启动各个节点,确保节点之间能够正常通信。
可以通过命令行或管理工具来启动节点,监控节点的状态并进行相关操作。
二、OceanBase的基本操作1. 连接数据库使用客户端工具连接到OceanBase数据库,输入正确的连接信息,包括IP地址、端口号、用户名和密码。
成功连接后,可以进行后续操作。
2. 创建数据库使用SQL语句创建新的数据库,指定数据库的名称和相关参数。
可以设置数据库的字符集、排序规则等。
创建完成后,可以在数据库中创建表和其他对象。
3. 创建表使用SQL语句创建新的表,指定表的名称和相关字段。
可以设置字段的数据类型、长度、约束等。
根据需求,可以创建单表或多表,并建立表之间的关系。
4. 插入数据使用INSERT语句向表中插入数据,指定要插入的字段和相应的值。
可以一次插入一条数据,也可以一次插入多条数据。
插入数据时,要确保数据的格式和类型与表定义的一致。
分布式事务执行原理

分布式事务执行原理咱先得知道啥是分布式事务呢。
想象一下,你去超市购物,你可能在生鲜区拿了菜,在零食区拿了薯片,在日用品区拿了牙膏。
这每个区就像是一个独立的小系统,而你最后结账这个事儿呢,就像是一个事务。
但这个超市很大很大,各个区的库存管理、计价系统可能都是分开的,这就是分布式的情况啦。
在分布式系统里,事务得保证几个重要的特性,就像我们做人要有原则一样。
这特性叫ACID,A是原子性,就是说事务里的操作要不全部成功,要不全部失败,就像你不能只付了菜钱,薯片和牙膏就白拿了,或者反过来,那可不行。
C是一致性,整个系统在事务前后得保持一种合理的状态,比如说库存得正确减少,你的钱得正确扣除。
I是隔离性,不同事务之间不能互相干扰,就像你结账的时候不能因为旁边有人也在结账就乱了套。
D是持久性,一旦事务提交了,那结果就得永久保存,不能说系统重启一下,你买的东西就不算数了。
那分布式事务是怎么执行来满足这些特性的呢?这里面有很多小秘密哦。
有一种办法叫两阶段提交(2PC)。
这就像是一场精心策划的表演。
第一阶段呢,叫准备阶段。
各个小系统(就像超市的各个区),先把自己要做的事儿准备好,比如检查库存够不够,计算价格对不对。
但是这个时候还不真正执行操作,就像演员在后台都准备好了,但是还没上台表演。
这个阶段每个小系统会告诉一个协调者,自己是不是能完成这个事务。
如果有一个小系统说不行,那这个事务就不能进行下去了。
第二阶段就是提交或者回滚阶段啦。
如果在第一阶段所有小系统都说自己能行,那协调者就会通知大家提交事务,这时候各个小系统才真正地去修改库存、收钱这些操作。
就像演员听到导演喊“开始表演”,然后才正式上台表演。
要是有一个小系统在第一阶段说不行,那协调者就会通知大家回滚,就像表演取消了,一切恢复原状。
不过2PC也有小缺点呢,要是协调者在第二阶段出了问题,比如说突然死机了,那有些小系统可能就不知道是该提交还是回滚了,这就有点小尴尬啦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
盘的原子性操作和硬件本身有关,磁盘一般是一个512 字节的块写入是原子的,SSD 一般是4KB 的块写入是原子的。
用一个数据结构的例子说明这种原子性实现机制。
struct Balance {int accountA;int accountB;};Balance * x =new Balance();上面是C++ 的结构体,表示了两个账户 A 和 B 的余额。
如果从 A 转账5 元给B,对应的C++ 代码如下:x->accountA -= 5;x->accountB += 5;上面的代码不是原子的,在两条语句中间,如果另一个线程读取accountA 和accountB 的值,会发现转账操作只执行了一半。
如果使用下面的代码,就可以保证无论什么时候读取,都不会读到转账执行了一半的情况:Balance * tmp = new Balance();tmp->accountA = x->accountA - 5;tmp->accountB = x->accountB + 5;x = tmp;操作的生效时间是x = tmp;语句,单一变量的赋值操作是原子的,保证了整个转账操作是原子的。
使用日志实现原子性(Atomicity)上面基于原子性操作的实现方法在数据结构中很常用,但是现在数据库系统都是使用日志技术(log)实现原子性(Atomicity),因为日志技术解决原子性的方法更灵活,还能同时解决了事务的持久性(Durability)需求,而且比直接持久化数据有更好的性能,所以几乎所有的数据库系统都采用了日志技术(log),甚至还包括文件系统、队列系统等。
使用log 时,先把整个事务的操作编码成连续的日志信息,再把日志信息写入持久化设备,当日志成功写入后,就是保证事务原子性成功的时机。
以上面的转账操作为例,编码出的日志信息如下:<accountA, balance, -5>, <accountB,, balance, +5>当上面的信息持久化成功后,数据库系统再会修改两个帐户的数据,而且帐户数据本身持久化到硬盘的时机可以延后到任意时刻,因为即使数据没有持久化前就宕机了,系统重启后还是可以从log 中将上面的转账操作恢复出来。
所以,转账事务的原子性(Atomicity)成功的时机就是log 持久化成功的时间点。
对于一次数据库事务,如果只有这么一条日志并且长度小于硬盘的一次原子写入操作,例如磁盘的512 字节,那么原子性很容易保证,这次写入成功了,事务就成功了;如果写入失败了,那么事务就没有完成。
如果事务只需要写一条日志但是日志长度大于一次原子写入的大小,就需要附加的手段来保证log 写入的原子性。
一种常见方法是用长度加上校验值(checksum),在这条日志的头部包含整条日志的长度和校验值(checksum)。
从日志文件里读取日志时,首先读到日志头部,获取日志长度和校验值(checksum),然后根据日志长度将整条日志内容读取出,并且和校验值(checksum)比对,如果一致,那么既认为日志时完整的,对应的事务也是成功提交的;如果校验值(checksum)不一致,那么认为事务失败。
如果事务的信息会分成多次写入硬盘,即事务包含多条日志。
在这多条日志中,每条日志的处理方法都与前面描述的一样,但是事务最终是否保证了原子性需要依赖这多条日志都持久化成功,所以数据库系统会在所有日志都持久化成功后再写最后一条确认日志,只有最后一条日志写成功了,事务才算成功,否则,事务还是会被回滚。
分布式事务原理上面这种方法适用的前提是事务的所有日志都在一个日志序列中。
当数据库是由多台机器组成时,每台机器都会有自己的日志,一个事务如果涉及多台机器,那么就会将日志写到多台机器上,我们称这种事务为分布式事务。
理论上,即使事务的日志分散在多台机器上,事务提交时,如果所有机器都持久化日志成功,那么事务就算提交成功,并且可以保证原子性(Atomicity)。
比较麻烦的是,如果机器重启,从日志中恢复事务状态时,同样需要询问所有机器来确认是否事务的所有日志都持久化成功了。
但是实际的系统中无法承受每次需要恢复事务状态时,都要对每个事务进行多机通讯。
所以,分布式事务采用两阶段提交的方式,对于单机写日志的流程进行扩展,来适应分布式事务。
典型的分布式事务流程如下:左侧(a) 是协调者状态机,右侧(b) 是参与者状态机。
协调者是驱动整个事务提交流程的主体,实现中它可以在任意机器上,当然也可以和其中一个参与者在一台机器上。
参与者是真正做事务操作的执行者。
协调者首先通知所有的参与者持久化(图中的prepare 命令),当参与者将事务的日志持久化成功后会回复prepare ok,当所有参与者都回复prepare ok 后,意味着整个事务完成了,然后协调者会写下事务commit 的日志,并且发送commit 给所有参与者,如果其中任何一个参与者返回失败(即abort ok),那么协调者就会认为事务是失败的,记下事务回滚的日志,并且发送abort 给所有参与者。
在这个流程下,分布式事务提交的延迟是2 次写日志(参与者写prepare 日志+ 协调者写commit 日志)的延迟和 2 次通讯(协调者通知参与者prepare + 协调者通知参与者commit)的延迟。
OceanBase 对于分布式事务的优化OceanBase 的两阶段提交协议对这个流程做了优化,事务是否提交本质上取决于是否事务的所有日志都持久化到硬盘中,不依赖协调者的日志,日志全部持久化的状态也是确定的。
所以,OceanBase 的两阶段提交流程取消了协调者写日志的过程,将协调者变成一个无持久化状态的状态机,状态机如下:看起来很复杂,是因为实际的工程项目中还需要处理各种异常情况,还有各种优化。
参与者状态机如下:在上面的协调者和参与者的状态机中,与经典状态机除了多了很多异常和优化的处理,还有一个最大的不同是多了一个CLEAR 阶段,理论上协调者完成commit 操作后整个事务流程就结束了,但是在实际实现中,虽然事务状态确定了,但是协调者和参与者之间还可能因为网络丢包或者机器异常等导致信息传输不确定的状况,需要互相查询状态或者重试,这时CLEAR 状态的意义就是保证所有状态机都达到确定状态了,才对状态机对应的数据结构进行清理。
OceanBase 对于协调者的优化前文描述过,在单机事务的场景中,如果一个事务需要写多条日志,在确认所有日志写成功后,会写下最后一条日志表示整个事务确认完成提交。
这最后一条日志的信息是可以和正常事务日志的最后一条合并在一起的。
但是在分布式事务中,两阶段提交的协调者在确认所有参与者上的日志都写成功后写下的commit 日志是无法从工程上与任何参与者的日志合并在一起的。
但是,事务是否提交本身是在所有参与者的日志都成功持久化的时候就确定了的。
所以,OceanBase 做的一个重大优化就是省去协调者的commit 日志。
调者接收到所有参与者的prepare ok 消息后,不写本地的commit 日志,直接给所有参与者发送commit 请求。
当参与者收到commit 请求后会写下commit 日志,这条日志是原始的协议中也会有的操作。
在这个模式下,极端的情况是当所有参与者都成功写下prepare 日志,但是在协调者发送commit 消息之前,系统出现宕机,如何恢复这个本应该成功的事务。
宕机重启后,参与者发现事务处于PREPARED 状态,则会询问协调者事务的状态。
因为协调者也是宕机重启了并且协调者不持久化任何信息,所以并没有任何协调者的状态。
但是协调者会在收到参与者的询问请求后,构建出协调者状态机,并询问其他所有参与者的事务状态,当发现所有参与者都是PREPARED 状态,就能确定这个事务是最终成功commit 的,然后会给所有参与者发送commit 请求,状态机就正常运转下去了。
OceanBase 对于单机多partition 事务的优化OceanBase 的部署是以partition 为单位,一台机器上的多个partition 分别有各自独立的paxos group,所以即使是一台机器上的事务,如果涉及多个partition,也是分布式事务。
多机的分布式事务应答用户的时机是在所有参与者应答协调者commit ok 之后,OceanBase 使用了MVCC 机制进行并发控制,参与者在事务提交时需要进行修改全局版本号的操作(下面章节会描述),所以参与者在收到commit 请求时,可以先修改全局版本号并且回复协调者,再持久化commit 日志。
但是commit 操作在网络上的round trip 时间还是需要消耗的。
对于单机多partition 事务,多个partition 需要修改的全局版本号其实是一个,所以协调者在收到所有参与者回复的prepare ok 请求后,认为事务可以提交时,就可以帮助参与者修改全局版本号,因为单机多partition 事务的协调者也一定是在这同一台机器上。
所以,协调者在收到参与者prepare ok 时即可应答用户事务提交成功,减少了一次commit round trip 的消耗。
隔离性(Isolation)数据库系统不能只服务一个用户,需要允许多个用户同时访问数据。
所以在保证事务原子性的同时,还需要保证当多用户同时访问时数据的正确性,这是非常挑战的事情。
数据库使用一种并发控制技术(Concurrency Control)来控制和协调同时在数据库系统中操作的事务。
常见的并发控制算法有Lock-based Concurrency Control 和Multiple Version Concurrency Control。
Lock-based Concurrency Control这种方法类似于数据结构设计中常用的锁机制。
数据库系统对用户在事务过程中操作的每一行数据进行加锁操作,如果是读操作就加上读锁,如果是写操作就加上写锁。
如果两个不同的事务试图修改同一行数据,第一个对这个数据加上写锁的事务是正常执行。
第二个事务为了保证数据的正确性,会等待第一个事务执行。
待第一个事务执行结束后释放行锁,第二个事务才恢复继续执行。
A 100B 200还以转账操作为例,上面标示 A B 两个帐户分别有100 块和200 块。
如果事务1 执行从A 帐户转10 块到B 帐户的操作,那么在事务一执行过程中,A B 两行数据都会被加上写锁。
如果第二个事务执行另一次转账操作,从 A 帐户转50 块到B 帐户,那么给行A 加写锁的时候会加不上,事务二会一直等待直到锁加上。
在上面的场景中,如果在事务一、二执行的过程中,另一个事务三查询 A B 两个帐户的信息,目的是统计 A B 两个帐户的余额总和。