原子性:如何打破事务高延迟的魔咒

75 阅读2分钟

2阶段提交:

image.png

缓存写提交

将所有写操作缓存起来,直到 commit 语句时一起执行,这种方式称为 Buffering Writes until Commit。

image.png

所有从 Client 端提交的 SQL 首先会缓存在 TiDB 节点,只有当客户端发起 Commit 时,TiDB 节点才会启动两阶段提交,将 SQL 被转换为 TiKV 的操作。

缺点:先提交的事务获胜,会影响开发者判断,不是完全意义上的交互事务。

管道

既能缩短延迟,又能保持交互事务的特点。

具体过程就是在准备阶段是按照顺序将 SQL 转换为 K/V 操作并执行,但是并不等待返回结果,直接执行下一个 K/V 操作。

image.png

整体事务延迟可以降到两轮共识算法开销

并行提交

持续压缩,准备阶段和commit并行执行。

准备阶段的操作,在 CockroachDB 中被称为意向写。这个并行执行就是在执行意向写的同时,就写入事务标志,当然这个时候不能确定事务是否提交成功的,所以要引入一个新的状态“Staging”,表示事务正在进行。那么这个记录事务状态的落盘操作和意向写大致是同步发生的,所以只有一轮共识算法开销。

而客户端得到所有意向写的成功反馈后,可以直接返回调用方事务提交成功。事后由异步线程根据事务表中的线索,再次确认事务的状态,并落盘维护状态记录。这样事务操作中就减少了一轮共识算法开销。

image.png

整体事务延迟可以降到一轮共识算法开销


此文章为6月Day11学习笔记,内容来源于极客时间《分布式数据库30讲》