用 erlang 描述 tcc
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的更多相关文章
- [Erlang 0129] Erlang 杂记 VI
把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM P23 简单介绍了Erlang C ...
- [Erlang 0126] 我们读过的Erlang论文
我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...
- [Erlang 0124] Erlang Unicode 两三事 - 补遗
最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...
- [Erlang 0120] Know a little Core Erlang
Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam: Eshell V6.0 ...
- [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2
声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...
- [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1
Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...
- [Erlang 0112] Elixir Protocols
Why Elixir 为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由? Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初 ...
- [Erlang 0110] Erlang Abstract Format , Part 1
Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...
- 在Windows用Rebar来构建,编译,测试,发布Erlang项目
rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...
- 基于Erlang VM的函数式编程语言Elixir
Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...
随机推荐
- 在Windows平台使用源码编译和安装PyTorch3D指定版本
最近在部署 SyncTalk 虚拟数字人项目时,需要安装很多依赖项,在执行到pip install --no-index --no-cache-dir pytorch3d -f https://dl. ...
- Windows应急响应-QQ巨盗病毒
目录 病毒背景 样本分析 开启监控 感染病毒 分析病毒行为 C盘文件监控 D盘文件监控 进程监控排查 服务排查 启动项排查 查杀 1.杀掉进程 2.异常服务 3.映像劫持处理 4.hosts文件处理 ...
- 精彩回顾|【ACDU 中国行·成都站】数据库主题交流活动成功举办!
2023年10月14日下午,[ACDU 中国行·成都站]在成都市武侯区星宸假日酒店圆满落下帷幕.本次活动由中国数据库联盟(ACDU)联合墨天轮社区主办,围绕「数据库技术及应用」这一主题,六位数据库资深 ...
- ajax异步请求数据还没有返回,页面时空白的如何处理
使用骨架屏,给用户一种正在解析数据的感觉 : element-ui的骨架屏 :https://element.eleme.cn/#/zh-CN/component/skeleton
- 24. echarts 可以画哪些图表
1. 折线图 2. 柱状图 3. 饼图 4. 地图 5. 雷达图 延申问题:画折线图和柱状图哪些配置可以改变样式 1. color 设置每个数据的颜色 2. grid 网格设置图表的大小 3. s ...
- 17 Transformer 的解码器(Decoders)——我要生成一个又一个单词
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- java基础语法(从0开始到java方法)
文章目录 1.第一个java程序 2.数据的表示详解 2.1 整数在计算机中的存储原理 2.2 字符在计算机中的存储原理 2.3 图片视频声音的存储原理 2.4 数据的其他表示形式 2.5 不同进制在 ...
- 【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框
哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight处理Dialogs对话框,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先**收 ...
- 来了,超全MQTT实用示例
Air201快速入门之MQTT示例 合宙Air201资产定位模组--是一个集成超低功耗4G通信.语音通话.超低功耗定位.计步.震动.Type-C.充电.放音.录音等功能的超小PCBA. 内部集成高效. ...
- 2023NOIP A层联测10 T4 子序列
2023NOIP A层联测10 T4 子序列 题面及数据范围 Ps:链接来自accoderOJ. 考场2小时才做完 T1,抱着试一试的心态看了 T4,然后想到做法了,调了 1 个多小时没调除了,赛后发 ...