一、引子

分布式事务组件seata最近社区很活跃,刚好公司有对接seata的计划。刚好借此机会,彻底了解下seata的价值。其中有一个比较特殊的模式叫SAGA模式,听起来就很懵逼,按照官网的介绍起源于一篇1987年的论文:

于是,决定翻译一下原文,附上论文链接如下:Princeton University Report ID: TR-070-87(如下载速度过慢,请点此博客园文件链接

二、读后总结

2.1 摘要

ABSTRACT


  Long lived transactions (LLTS) hold on to database resources for relatively long periods of time, significantly delaying the termination of shorter and more common transactions. To alleviate these problems we propose the notion of a saga. A LLT is a saga if it can be written as a sequence of transactions that can be interleaved with other transactions. The database management system guarantees that either all the transactions in a saga are successfully completed or compensating transactions are run to amend a partial execution. Both the concept of saga and its implementation are relatively simple but they have the potential to improve performance significantly. We analyze the various implementation issues related to sagas, including how they can be run on an existing system that does not directly support them. We also discuss techniques for database and LLT design that make it feasible to break up LLTs into sagas.


January 7, 1987  

翻译:

  一个长时间事务会在相对较长的时间内占用数据库资源,明显的阻碍了较短的和公用的其他事务完成。为了缓解这些问题, 我们提出一个 saga的概念。它是由多个有序的事务组成、并且与其他事务可以交错的一个长时间事务(LLT),数据库管理系统保证成功完成 saga 中的所有事务, 或对部分进行事务补偿。saga的概念和它的实施相对简单, 但它们有可能显著提高性能。我们分析了与 sagas 相关的各种实施问题,包括如何在不直接支持它们的现有系统上运行它们。我们进行了数据库和 LLT技术讨论, 使 sagas成为LLT解决方案的可能。

1987年1月7日

2.2 核心概念

1.SAGA的两种场景

Once compensating transactions C1, C2, ..., Cn-1 are defined for saga T1, T2, ..., Tn, then the system can make the following guarantee. Either the sequence T1, T2, ..., Tn
        (which is the preferable one) or the sequence
        T1, T2, ..., Tj, Cj, ..., C2, C1
for some 0 ≤ j < n will be executed.

翻译:

一旦将 saga 的 T1, T2, ..., Tn 子事务的取消补偿事务定义为 C1, C2, ..., Cn-1 ,那么 这个系统将会作出如下保证,任何一个序列

        【T1, T2, ..., Tn】

        (最好是一个)或者【这个序列

        T1, T2, ..., Tj, Cj, ..., C2, C1

对于0 ≤ j < n 将被执行】(为啥j=n不行?需要补偿时,至少有一个失败,否则全部成功就是T1~Tn了。这也是只有Cn-1的原因)。

说的狠懵逼,其实就是

  • 1.正向全部执行(T1, T2, ..., Tn)
  • 2.执行到第J个事务时(T1, T2, ..., Tj)出错,逆向从J回退(Cj, ..., C2, C1)补偿一遍。

2.SAGA事务特性

Note that the notion of a saga is related to that of a nested transaction [Garc83a, Lync83a]. However there are two important differences:
(a)A saga only permits two levels of nesting the top level saga and simple transactions, and
(b)At the outer level full atomicity is not provided. That is, sagas may view the partial results of other sagas.

翻译:

请注意,saga的概念与嵌套事务的概念有关[Garc83a, Lync83a]。但是, 有两个重要的区别:

  • (a)一个 saga 嵌套只允许有2层,顶级的 saga 第一层,里面的简单事务为第二层。
  • (b)在外部层面看不提供完全的原子性。也就是说,某个saga可能看到其他saga的部分结果。(违反了事务的隔离性)

3.恢复模式

逆向恢复:补偿事务。

正向恢复:系统需要保存点。

混合恢复:T1、T2(保存点S1)、T3、T4时奔溃。先执行逆向恢复到S1,再执行正向恢复T3、T4.

4.如何实现SAGA

Also recall that pure forward recovery does not require compensating transactions (see Section 5). So if compensating transactions are hard to write, 
then one has the choice of tailoring the application so that LLTs do not have user initiated aborts. Without these aborts, pure forward recovery is feasible and compensation is never needed.

翻译:

LLT设计补偿事务是一个非常普遍的难题。

1)如果这种补偿机制很难写的话,考虑业务上正向补偿:正向补救措施。

As has become clear from our discussion, the structure of the database plays an important role in the design of sagas. Thus, it is best not to study each LLT in isolation, 
but to design the entire database with LLTs and sagas in mind. That is, if the database can be laid out into a set of loosely-coupled components (with few and simple inter-component consistency constraints,
then it is likely that the LLT will naturally break up into sub-transactions that can be interleaved.

2)DB的结构在saga设计中扮演着关键角色,因此最好不要孤立地研究每种LLT,而是在设计数据库时就把LLT和saga考虑进去。如果DB能被设计成一套松耦合的组件(少且简单的一致性约束),那么LLT就能自然地拆解为多个子事务编织而成。

================引用===============================

1.《Sagas.pdf》论文原文。

2.https://github.com/mltds/sagas-report 翻译。

Sagas论文原文读后总结的更多相关文章

  1. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  2. 《Effective Objective-C 2.0》 读后总结

    感觉自己最近提升很慢了.然后去找了一些面试题看看.发现自己自大了.在实际开发中,让我解决bug.编写功能,我有自信可以完成.但是对项目更深层的思考,我却没有.为了能进到自己的目标BAT.也为了让自己更 ...

  3. 浏览器渲染原理笔记 --《How Browser Work》读后总结

    综述 之前使用ExtJS时遇到一个问题:为什么依次设置多个组件的可见性界面会卡顿?在了解HTML的dom操作相关内容的时候也好奇这个东西到底是怎么回事,然后尤其搞不懂CSS和Html分管样式和网页结构 ...

  4. WiscKey: Separating Keys from Values in SSD-Conscious Storage [读后整理]

    WiscKey: Separating Keys from Values in SSD-Conscious Storage WiscKey是一个基于LSM的KV存储引擎,特点是:针对SSD的顺序和随机 ...

  5. 新生 & 语不惊人死不休 —— 《无限恐怖》读后有感

    开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...

  6. 论文泛读:Click Fraud Detection: Adversarial Pattern Recognition over 5 Years at Microsoft

    这篇论文非常适合工业界的人(比如我)去读,有很多的借鉴意义. 强烈建议自己去读. title:五年微软经验的点击欺诈检测 摘要:1.微软很厉害.2.本文描述了大规模数据挖掘所面临的独特挑战.解决这一问 ...

  7. 《Effective Java》——读后总结

    这本书在Java开发的行业里,颇有名气.今天总算是粗略的看完了…后面线程部分和序列化部分由于心浮气躁看的不仔细.这个月还剩下一周,慢慢总结消化. 1.静态工厂方法代替构造器 静态工厂方法有名称,能确切 ...

  8. ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)

    虽然ICCV2019已经公布了接收ID名单,但是具体的论文都还没放出来,为了让大家更快得看论文,我们汇总了目前已经公布的大部分ICCV2019 论文,并组织了ICCV2019论文汇总开源项目(http ...

  9. [高性能MYSQL 读后随笔] 关于事务的隔离级别(一)

    一.锁的种类 MySQL中锁的种类很多,有常见的表锁和行锁,也有新加入的Metadata Lock等等,表锁是对一整张表加锁,虽然可分为读锁和写锁,但毕竟是锁住整张表,会导致并发能力下降,一般是做dd ...

  10. 《如何正确学习JavaScript》读后小结

    在segmentfault上读的一篇学习JavaScript路线的文章,做个小结. 一.简介.数据类型.表达式和操作符 (1)<JavaScript权威指南>前言1-2章&< ...

随机推荐

  1. 深入浅出Java多线程(三):线程与线程组

    「引言」 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第三篇内容:线程与线程组.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代软件开发中,多线程编程已成 ...

  2. (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址

    向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...

  3. 基于javascript引擎封装实现算术表达式计算工具类

    JAVA可动态计算表达式的框架非常多,比如:spEL.Aviator.MVEL.EasyRules.jsEL等,这些框架的编码上手程度.功能侧重点及执行性能各有优劣,网上也有大把的学习资料及示例代码, ...

  4. 【进阶篇】Java 实际开发中积累的几个小技巧(一)

    目录 前言 一.枚举类的注解 二.RESTful 接口 三.类属性转换 四.Stream 流 五.判空和断言 5.1判空部分 5.2断言部分 文章小结 前言 笔者目前从事一线 Java 开发今年是第 ...

  5. delphi调试 字符串 栈的地址,和栈中存的值

  6. DHCP中继代理配置与管理

    实验介绍:DHCP中继存在目的 当一台DHCP需要配置不同网段的IP地址时 一:前期准备 1.在DHCP服务器配置页面 右键ipv4,建立多个作用域. 我这里设置了三个可以分配给服务器端的网段,分别是 ...

  7. .NET 大数据实时计算--学习笔记

    摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...

  8. Hive报错:Call From hadoop01/172.23.238.2 to hadoop01:10020 failed on connection exception

    问题描述 在阿里云服务器上安装的Hadoop和Hive,刚开始关闭了防火墙.但是由于服务器被被黑客安装挖矿程序,所以开启了防火墙.但是即使开启了所有可能的端口,但是在向Hive中插入数据时,依然报错提 ...

  9. sensitive-word v0.13 特性版本发布 支持英文单词全词匹配

    拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署? sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word ...

  10. XTW100编程器在Win10下的安装

    XTW100 这是一个淘宝上卖得很多的经典编程器, 用于写入24和25系列的存储芯片. 最初使用的是stm32f103c8t6, 因为f103价格飞涨, 市面上大都换成国产的兼容mcu了, 软件和使用 ...