Laravel 分布式事务处理

TCC是现在非常流行分布式处理模式,属于柔性事务。柔性事务,基于分布式领域BASE理论,它是在CAP理论(一致性、可用性、分区容忍性)的基础之上的延伸,包括:基本可用(Basically Available)、柔性状态(Soft State)、最终一致性(Eventual Consistency)。

* 基本可用:分布式系统出现故障的时候,允许损失一部分可用性。
* 柔性状态:允许系统存在中间状态,这个中间状态又不会影响系统整体可用性。
* 最终一致性:数据经过重试等机制处理后,最终数据能达到一致。

处理方式
两阶段提
file

交事务补偿型
file

最大努力型
file

laravel 分布式事务处理 - 2PC 两阶段
事务管理器:

    /**
     * 分布式事务处理
     * @param $xids
     */
    public function XAProcess($xids)
    {
        try {

            $status = array();
            foreach ($xids as $xid) {
                $status[$xid] = false;
                $translog = TransLog::where('xid',$xid)->get();
                try {
                    foreach ($translog as $item) {
                        $this->pdo->$xid->query($item->sql);
                        Log::info("Transaction SQL:".json_encode($item->sql));
                    }
                    $status[$xid] = true;
                } catch (\Exception $e) {
                    $status[$xid] = false;
                }
            }

            if (!in_array(false,array_values($status))) {
                $this->Commit($xids);
                Log::info('transaction committed');
            } else {
                $this->Rollback($xids);
                Log::info('transaction rollback');
            }

        } catch (\Exception $e) {
            $this->Rollback($xids);
            Log::info('transaction rollback:'.$e->getMessage());
        }

    }

    /**
     * 事务提交
     * @param $xids
     */
    public function Commit($xids)
    {
        $this->XAEnd($xids);
        $this->XAPrepare($xids);
        $this->XACommit($xids);
    }

    /**
     * 事务回滚
     * @param $xids
     */
    public function RollBack($xids)
    {
        $this->XAEnd($xids);
        $this->XAPrepare($xids);
        $this->XARollback($xids);
    }

    /**
     * 事务开始
     * @param $xids
     */
    public function XAStart($xids)
    {
        foreach ($xids as $xid) {
            $this->pdo->$xid = $this->getPdo('mysql');
            $this->pdo->$xid->exec("XA START '$xid'");
        }
    }

    /**
     * 事务结束
     * @param $xids
     */
    public function XAEnd($xids)
    {
        foreach ($xids as $xid) {
            $this->pdo->$xid->exec("XA END '$xid'");
        }
    }

    /**
     * 事务预处理
     * @param $xids
     */
    public function XAPrepare($xids)
    {
        foreach ($xids as $xid) {
            $this->pdo->$xid->exec("XA PREPARE '$xid'");
        }
    }

    /**
     * 事务提交
     * @param $xids
     */
    public function XACommit($xids)
    {
        foreach ($xids as $xid) {
            $this->pdo->$xid->exec("XA COMMIT '$xid'");
        }
    }

    /**
     * 事务回滚
     * @param $xids
     */
    public function XARollback($xids)
    {
        foreach ($xids as $xid) {
            $this->pdo->$xid->exec("XA ROLLBACK '$xid'");
        }
    }

    /**
     * 执行sql
     * @param $sql
     */
    public function XAQuery($sql)
    {
        $this->pdo->query($sql);
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
Ethan Smart & AI Algorithm
本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

高阶操作,可以的

5年前 评论
xiao

XAPrepare 和XAStart 方法貌似没有调用呢

5年前 评论

都是伪代码,这样还不如不用代码

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!