Transaction 视为一个 Actor.

    start_transaction(Order) ->
p1 = spawn(start_order(self, Order.subOrder1)) # 酒店
p2 = spawn(start_order(self, Order.subOrder2)) # 航空公司
p3 = spawn(start_order(self, Order.subOrder3)) # 汽车公司
wait_try_success(Order, [p1, p2, p3]) wait_try_success(Order, Actors) ->
receive
try_success ->
if all_tried
Actors.forEach(actor => actor ! confirm)
wait_confirm_success(Order, Actors)
try_failed ->
Actors.forEach(actor => actor ! cancel)
timeout ->
Actors.forEach(actor => actor ! cancel) wait_confirm_success(Order, Actors) ->
receive
confirm_success ->
if all_confirmed
done
confirm_failed ->
Actors.forEach(actor => actor ! cancel)
timeout ->
Actors.forEach(actor => actor ! cancel)

每个任务视为一个 actor,

    start_order(Transaction, Order) ->
try()
Transaction ! try_success
wait_confirm(Transaction, Order) wait_confirm() ->
receive
confirm ->
confirm()
Transaction ! confirm_success
timeout ->
cancel()
Transaction ! failed
cancel ->
cancel()

发起人启动 Transaction, 该 Transaction 启动 order actor, 并进入 try.

order actor 收到订单时, 执行 try, 等待 confirm.

Transaction 收集满所有相关 actor 的 try_success 后, 通知 confirm.

收集齐所有 confirm_success 后, 事务完成.

  • 如收到 confirm_failed 后 try_failed, 则群发 cancel.
  • 如超时, 亦群发 cancel.

order actor 在 wait_confirm 状态, 如超时或收到 cancel 均回滚.

当然, TCC 也无法解决 confirm 成功的 actor 再也联系不上的问题. 联系不上只能通过可靠送达的 MQ 来解决, 如节点 confirm 后再也不开机了也就无可奈何了.

用 erlang 描述 tcc的更多相关文章

  1. [Erlang 0129] Erlang 杂记 VI

    把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM   P23 简单介绍了Erlang C ...

  2. [Erlang 0126] 我们读过的Erlang论文

    我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...

  3. [Erlang 0124] Erlang Unicode 两三事 - 补遗

    最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...

  4. [Erlang 0120] Know a little Core Erlang

      Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam:   Eshell V6.0 ...

  5. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2

    声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...

  6. [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...

  7. [Erlang 0112] Elixir Protocols

    Why Elixir   为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由? Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初 ...

  8. [Erlang 0110] Erlang Abstract Format , Part 1

    Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...

  9. 在Windows用Rebar来构建,编译,测试,发布Erlang项目

    rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...

  10. 基于Erlang VM的函数式编程语言Elixir

    Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...

随机推荐

  1. 【赵渝强老师】在MongoDB中使用游标

    一.什么是游标? 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标实际上是一种能从包括多条数据记录的结果集 ...

  2. 优质技术文章分享 | 首届【MogDB数据库征文活动】进行中,期待您的参与

    2022年6月30日,MogDB 3.0版本正式发布,基于2.1版本进一步增强,集成了openGauss 3.0.0版本的新增特性,并融合了云和恩墨的创新特性研发,持续助力用户达成安稳易用的企业级数据 ...

  3. .Net 中带有 ? 的运算符

    // 带 ? 的表达式 // 1. 三元表达式 // 2. ?? 双问号 // obj1 ?? obj2 如果 obj1 为 空(null) 返回 obj2 // Configure the HTTP ...

  4. vue打包的时候删除 console 和 debugger

    esbuild: { pure: VITE_DROP_CONSOLE ? ['console.log', 'debugger'] : [], supported: { // https://githu ...

  5. 38. data为什么是一个函数

    vue中的data为什么是返回对象的函数,而不是直接使用对象形式 : 我们复用组件的时候,要求每一份data数据之间是独立的,不能互相影响,如果写成对象的形式所有的组件使用一份data数据 ,如果使用 ...

  6. 0503-autograd实战之线性回归

    0503-autograd实战之线性回归 目录 一.用 variable 实现线性回归(autograd 实战) 二.第五章总结 pytorch完整教程目录:https://www.cnblogs.c ...

  7. .NET 8 实现无实体库表 API 部署服务

    前言 快速将创意变为现实!无需实体建库建表即可完成增删改查操作,支持15种条件查询.分页.列表及无限级树形列表等多种功能的API部署. 提供完善的接口文档.Auth授权.接口限流.客户端真实IP获取. ...

  8. 配置和使用nvm免安装版本(nvm-noinstall.zip)

    配置和使用nvm免安装版本(nvm-noinstall.zip) NVM(Node Version Manager)是一个用于管理多个Node.js版本的命令行工具一下分几个步骤说明如何配置和使用nv ...

  9. 封装socket 到vue2.x 使用

    vue2.x 使用 socket 数据交互 简单封装 socket //生成唯一标识符 function getUuid { let s = []; let hexDigits = "012 ...

  10. 2024/10/3 CSP-S模拟赛20241003

    A 恶心恶心恶心,赛时写了一个二分+线段树的复杂度错了,当时yzh和lyz就一会骗我一会说实话的,搞得很懵,自己水平也是菜,那线段树分析复杂度怎么不把递归次数乘上呢?大傻逼grz 思路其实还挺好的. ...