当前位置:首页 > PHP

php 实现tcc

2026-02-28 11:14:18PHP

php 实现tcc

php 实现tcc

TCC模式简介

TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,通过业务逻辑拆分实现最终一致性。包含三个阶段:

  • Try:预留资源,完成业务检查
  • Confirm:确认执行业务操作
  • Cancel:取消执行,释放预留资源

PHP实现TCC核心组件

事务管理器

class TccTransactionManager {
    private $transactions = [];

    public function begin($transactionId) {
        $this->transactions[$transactionId] = [
            'status' => 'trying',
            'participants' => []
        ];
    }

    public function registerParticipant($transactionId, $participant) {
        $this->transactions[$transactionId]['participants'][] = $participant;
    }

    public function confirm($transactionId) {
        foreach ($this->transactions[$transactionId]['participants'] as $p) {
            $p->confirm();
        }
        unset($this->transactions[$transactionId]);
    }

    public function cancel($transactionId) {
        foreach ($this->transactions[$transactionId]['participants'] as $p) {
            $p->cancel();
        }
        unset($this->transactions[$transactionId]);
    }
}

参与者接口

interface TccParticipant {
    public function try();
    public function confirm();
    public function cancel();
}

实现示例:订单服务

Try阶段实现

class OrderService implements TccParticipant {
    public function try() {
        // 冻结库存/预创建订单
        $order = Order::create(['status' => 'pending']);
        return ['order_id' => $order->id];
    }

    public function confirm() {
        // 确认订单
        Order::where('status', 'pending')->update(['status' => 'confirmed']);
    }

    public function cancel() {
        // 取消订单
        Order::where('status', 'pending')->delete();
    }
}

事务协调流程

$tm = new TccTransactionManager();
$transactionId = uniqid();

try {
    $tm->begin($transactionId);

    $orderService = new OrderService();
    $tm->registerParticipant($transactionId, $orderService);

    // 执行Try阶段
    $orderService->try();

    // 所有Try成功后执行Confirm
    $tm->confirm($transactionId);
} catch (Exception $e) {
    // 任一Try失败执行Cancel
    $tm->cancel($transactionId);
}

增强实现建议

持久化存储

class DatabaseTransactionStorage {
    public function save($transactionId, $data) {
        DB::table('tcc_transactions')->updateOrInsert(
            ['transaction_id' => $transactionId],
            ['data' => json_encode($data)]
        );
    }
}

定时任务补偿

class TccCompensator {
    public function handleTimeoutTransactions() {
        $expired = DB::table('tcc_transactions')
            ->where('created_at', '<', now()->subMinutes(30))
            ->get();

        foreach ($expired as $tx) {
            $data = json_decode($tx->data, true);
            if ($data['status'] === 'trying') {
                (new TccTransactionManager())->cancel($tx->transaction_id);
            }
        }
    }
}

注意事项

  • 必须实现幂等性:Confirm/Cancel可能被重复调用
  • 需要记录事务日志用于故障恢复
  • Try阶段应设置合理的超时时间
  • 建议结合消息队列实现异步Confirm/Cancel

以上实现展示了PHP中TCC模式的核心逻辑,实际应用中需根据具体业务场景调整实现细节。分布式事务表应包含事务ID、创建时间、状态等关键字段,补偿机制需要定期扫描未完成的事务进行后续处理。

标签: phptcc
分享给朋友:

相关文章

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…