2021-03-03

OceanBase并发控制

OceanBase 数据库基于多版本(Multi Version)及行级别锁实现了数据库的并发控制逻辑、读不加锁、写加互斥锁。做到了读读、读写、写读不相互阻塞,大大提高了系统的并发能力。由于读读并发对数据没有任何修改,因此没有正确性的问题。关于并发控制的设计,下文主要讨论读写、写读、写写三种情况。

事务版本号

语句快照

RC 隔离级别下,每条语句都能读到该语句开始之前的最新数据,这一特性的保证,需要在语句开启之前获取一次最新快照版本,该版本我们称为语句快照。

事务快照

可串行化隔离级别下,事务内的每条语句只能看到该事务开启之前的数据,这一特性的保证,需要在开启事务之前获取一次最新快照版本,该版本我们称为事务快照。RR 隔离级别下,OceanBase 数据库也采用事务级别快照。

提交版本号

事务提交过程中需要为本次修改的数据确定一个版本号,我们称之为事务的提交版本号。GTS 打开场景下,提交版本号从 GTS Leader 获取并确认;GTS 关闭场景下,提交版本号由数据所在 server 共同进行协商。

一致性读

OceanBase 数据库支持两种类型的读请求,强一致性读和弱一致性读。强一致性读要求根据快照信息读取 leader 上的数据;弱一致性读允许读取某一个稍旧的版本的数据。

强一致性读

跨机查询的语句,需要获取全局一致的快照,否则无法保证强读的一致性。因此该情况下,需要确保 GTS 是打开的。

单机的查询,理论上不需要依赖 GTS,通过获取待读分区的最大已经提交的版本号,取其最大值作为读快照,就能保证强读的一致性。

弱一致性读

用户使用弱读的功能,有两种方法:

查询语句添加 hint

Select /*+read_consistency(weak)*/ * from test where c1=1;

设置系统变量

Session 级别设置:

set @@ob_read_consistency=2,其中1=FROZEN、2=WEAK、3=STRONG;

用户级别设置:

set global ob_read_consistency=2;

OceanBase 数据库维护了一个租户级别最大安全可读的版本号,弱读语句快照由该版本号决定。非 RC 隔离级别的弱读没有意义,因此 OceanBase 数据库只在 RC 隔离级别下支持弱读。

下文讨论的并发控制,没有特殊说明,均指的是强一致性读。

写读并发

对某行数据而言,读写事务和只读事务并发执行,只读事务读取过程中,该行正在被读写事务修改且尚未提交,我们称之为写读并发。

该场景下,OceanBase 数据库的正确性保证逻辑如下:

读写事务 T1 提交过程中,确定 commit 成功之前,该事务的提交版本号(commit version)是无法知道的。此时如果有读事务 T2 并发读取该行,是否能够读到该事务的修改呢?需要分情况讨论:如果 T1 的提交版本号(commit version) < T2 的读快照(read version),则 T2 需要读到 T1 的修改;否则 T2 不需要读到 T1 的修改。

具体而言,如果 T1 此时尚未收到用户发来的 commit,那么 T2 的 read version 一定会小于 T1 的 commit version,因此该情况下 T2 不需要等T1提交结束;如果T1此时处于正在提交过程中,则T2需要等T1确定 commit version,才能决定是否需要读T1修改的数据。这里的等待对用户而言是透明的,因此仍能满足“写不阻塞读”的这一结论。

读写并发

对某行数据而言,读写事务和只读事务并发执行,读写事务操作该行之前,已经有只读事务对该行进行读操作,我们称之为读写并发。该场景下,OceanBase 数据库的正确性保证逻辑如下:

只读事务读取过程中,读写事务还在执行,客户端尚未发出 commit,因此 T1 的 read version 一定小于 T2 的 commit version,T1 不需要读到 T2 的修改。T1 和 T2 不会相互等待。

写写并发

写写并发场景,主要通过对行加互斥锁来实现,即前一个事务尚未提交结束,后一个需要操作同一行的事务需要等待。写写并发场景,lost update 问题是重点需要解决的。考虑事务 T1 和事务 T2,两者并发单分区表 A 中的同一行 R1,待更新的列上有局部索引。执行流程如下:

事务 T1 和事务 T2 语句开启,获取相同的语句快照版本号,假设均为 100。

事务 T1 语句执行过程中,先于 T2 获取行锁,并执行更新。事务 T2 出现行锁冲突,重试等行锁释放。

事务 T1 提交结束,行锁释放。

事务 T2 该如何执行?如果 T2 直接持有行锁,继续修改,将会出现数据一致性问题,因为 T2 并没有看到 T1 的修改,直接将其数据进行了覆盖。OceanBase 数据库为了解决该问题,T2 加上 R1 的行锁之后,会进行一次 Double Check,如果发现存在该问题,不同隔离级别下的处理方法不同:

RC 隔离级别下重试执行该语句。

可串行化隔离级别下,该语句不能重试并且需要向用户返回如下错误:

ORA-08177: Cannot serialize access for this transaction

当数据库返回 ORA-08177 时,用户可以根据业务的情况做出决定:

回滚事务,然后重新执行整个事务。或者,

提交该语句之前的事务。或者,

回滚到某个 save point 然后执行其他分支。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容