当前位置:首页 > PHP

php 实现tcc

2026-02-28 11:14:18PHP

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、创建时间、状态等关键字段,补偿机制需要定期扫描未完成的事务进行后续处理。

php 实现tcc

标签: phptcc
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE o…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数:…

php实现静态

php实现静态

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

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…