zoukankan      html  css  js  c++  java
  • 用 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 后再也不开机了也就无可奈何了.

  • 相关阅读:
    VB.Net计算含日文的字符串长度
    修改三个属性,就可以让错误提示更详细
    ORACLE分页查询SQL语法
    探知主力仓位的原理
    Linux手机研发五大难关
    当SNS在垂直行业嫁接电子商务
    实时股票数据获取方式
    商业周刊:网民周末更爱移动Web 分类信息超社交
    Linux下的C编程实战
    想起了赵丹阳
  • 原文地址:https://www.cnblogs.com/inshua/p/13404727.html
Copyright © 2011-2022 走看看