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);
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章