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

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Laravel中,分布式事务可以通过将门面DB替换为RT来实现。首先,你需要安装laravel5.5 - laravel8之间的版本,并安装composer包。然后,在你的代码中,将DB::beginTransaction()和DB::commit()分别替换为RT::beginTransaction()和RT::commit(),以实现分布式事务。具体的代码例子可以参考如下: ```php <?php use Illuminate\Support\Facades\DB; use Laravel\ResetTransaction\Facades\RT; RT::beginTransaction(); // 在分布式事务内部执行的代码 // ... RT::commit(); ``` 为了测试分布式事务,你需要创建三个MySQL数据库实例(order,storage,account),三个控制器,三个模型,并在phpunit.xml中添加一个名为Transaction的testsuite。然后,启动Web服务器,执行以下命令完成这些操作: ```bash php artisan resetTransact:create-examples && php artisan serve --host=0.0.0.0 --port=8000 ``` 这样就完成了Laravel分布式事务的设置和准备工作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Laravel基于RT模式实现分布式事务(突破技术支持子服务嵌套事务)](https://blog.csdn.net/DongShiXiaRen/article/details/122665094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值