OceanBase1.0的分布式事务讲解

合集下载

OceanBase分布式技术架构分析

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分布式事务以及两阶段提交实现具体设计眼下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是阿里巴巴集团自主研发的一款分布式数据库系统,具有高可用、高可靠、高扩展性等特点。

它的底层原理涉及到分布式存储、分布式事务、分布式索引等多个方面。

下面将从这些方面详细介绍OceanBase的底层原理。

1. 分布式存储OceanBase采用了分布式存储架构,将数据分散存储在多个节点上,提高了数据的可靠性和可用性。

它使用了一种称为“Sharding”的技术,将数据按照一定的规则分割成多个片段,并将这些片段分布在不同的节点上。

这种方式可以使得数据的访问更加高效,同时也能够提高系统的容错性。

2. 分布式事务在分布式场景下,保证数据的一致性是一个重要的问题。

OceanBase 通过使用多副本和分布式事务来解决这个问题。

多副本可以保证数据的可靠性,即使某个节点出现故障,系统仍然能够正常运行。

而分布式事务则可以保证多个节点上的数据操作是一致的,避免了数据的冲突和不一致。

3. 分布式索引索引是数据库系统中非常重要的一个组成部分,它可以提高查询效率。

OceanBase的底层原理中也包含了分布式索引的设计。

它采用了一种称为“DolphinDB”的技术,将索引数据分布在多个节点上,并通过一定的算法将数据定位到正确的节点上进行查询。

这样可以使得索引的访问更加高效,并且能够支持海量数据的快速检索。

4. 分布式调度OceanBase的底层原理中还包括了分布式调度的设计。

它通过一种称为“OceanScheduler”的技术,将任务分配给不同的节点进行执行。

这样可以使得系统的负载均衡,提高系统的稳定性和性能。

5. 分布式计算除了存储和索引,OceanBase的底层原理中还包括了分布式计算的设计。

它通过一种称为“OceanCompute”的技术,将计算任务分发到不同的节点上进行并行计算。

这样可以提高计算效率,同时也能够支持大规模数据的处理。

总结起来,OceanBase的底层原理涉及到分布式存储、分布式事务、分布式索引、分布式调度和分布式计算等多个方面。

oceanbase概述

oceanbase概述

OceanBase概述一、介绍OceanBase是一款分布式关系型数据库管理系统(RDBMS),由中国阿里巴巴集团自主研发并维护。

它致力于为全球用户提供高性能、高可用、高可靠的数据存储服务,以满足企业级应用对数据的存储和管理需求。

OceanBase的出现,填补了我国在数据库领域的空白,标志着我国在数据库核心技术上的重大突破。

二、发展历程OceanBase的发展历程可以追溯到2010年,当时阿里巴巴集团为了解决“双十一”购物狂欢节期间的大规模数据处理问题,开始研发一款全新的数据库系统。

经过多年的发展和完善,OceanBase已经成为了全球领先的分布式关系型数据库管理系统之一。

三、技术特点1. 分布式架构:OceanBase采用分布式架构,可以横向扩展,支持海量数据的存储和处理。

2. 高可用性:OceanBase具有高可用性,通过数据复制和故障切换技术,确保数据的可靠性和业务的连续性。

3. 高性能:OceanBase具有高性能,通过优化的数据存储和查询算法,提供快速的数据处理能力。

4. 多租户支持:OceanBase支持多租户模式,可以为多个用户提供独立的数据空间,保证数据的安全性和隐私性。

四、应用场景OceanBase广泛应用于各种场景,包括电商、金融、物流、教育、医疗等领域。

例如,它可以作为电商平台的后台数据库,支持每秒处理数百万笔交易;也可以作为金融机构的数据中心,存储和处理大量的金融交易数据;还可以作为物流公司的订单管理系统,支持实时的订单处理和追踪。

五、未来展望随着大数据和云计算技术的发展,OceanBase将继续发挥其分布式数据库的优势,提供更加强大和灵活的数据存储和处理能力。

同时,OceanBase也将积极探索新的技术领域,如人工智能、物联网等,以推动数据库技术的进一步发展。

六、总结OceanBase作为我国自主研发的分布式关系型数据库管理系统,不仅在技术上具有领先优势,而且在实际应用中也展现出了强大的能力。

OceanBase1.0的分布式事务讲解

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分布式事务原理

oceanbase分布式事务原理在分布式环境中,一个事务可能需要跨多个分布式节点进行操作,这就导致了分布式事务的一致性和可靠性难以保证。

为了解决这个问题,2PC协议被提出。

2PC协议分为两个阶段:准备阶段和提交阶段。

在准备阶段,事务的协调者向所有参与者发送prepare请求,参与者执行事务,并将undo和redo信息记录在本地日志中。

当参与者执行成功后,将给协调者发送ack消息。

如果有任何一个参与者执行失败,会向协调者发送abort消息。

使用2PC协议可以确保分布式事务的一致性,但是这种协议在性能上存在一定的问题。

首先是协议需要等待所有参与者的响应,如果有任何一个参与者响应超时或失败,可能会导致整个事务的阻塞。

其次是协议的同步通信机制导致整个过程的延迟比较大。

为了解决这些问题,OceanBase引入了基于Paxos协议的复制机制来实现分布式事务的原子性和持久性。

Paxos是一种基于一致性算法的分布式协议,它可以实现在不可靠的网络环境下,通过多个节点之间的消息交换来达成一致的共识。

在OceanBase中,Paxos协议用于将数据复制到多个节点,并确保在分布式事务中的数据访问和更新按照指定的原子操作执行。

具体来说,当一个事务需要在多个节点上进行操作时,OceanBase使用Paxos协议来协调不同节点上的操作顺序以及数据的复制。

每个节点都可以作为一个副本,每个副本都有自己的唯一标识,通过Paxos协议选举一个节点作为leader,负责协调事务的执行。

使用Paxos协议可以保证分布式事务的原子性和可靠性,同时也解决了2PC协议在性能上的问题。

因为Paxos协议可以容忍少数节点的故障和延迟,不需要等待所有节点的响应。

综上所述,OceanBase采用了两阶段提交和基于Paxos协议的复制机制来实现分布式事务的一致性和可靠性。

这些机制可以保证分布式环境下的数据访问和更新的原子性、一致性和持久性,并且在性能上有一定的优势。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 两个帐户的余额总和。

相关文档
最新文档