当前位置:首页 > PHP

php 实现tcc

2026-02-14 12:02:40PHP

TCC 模式简介

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

php 实现tcc

  • Try:预留资源,完成业务检查(如冻结账户余额)。
  • Confirm:确认执行,提交实际业务(如扣减余额)。
  • Cancel:取消操作,释放预留资源(如解冻余额)。

PHP 实现 TCC 的关键步骤

数据库设计

创建事务记录表,存储事务状态和操作日志:

CREATE TABLE tcc_transaction (
    id VARCHAR(36) PRIMARY KEY,
    status ENUM('trying', 'confirmed', 'cancelled') NOT NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Try 阶段实现

  1. 生成全局事务ID(如UUID)。
  2. 在本地事务中插入状态为 trying 的记录。
  3. 执行预留资源操作(如冻结余额):
    // 示例代码片段
    $transactionId = uniqid();
    $pdo->beginTransaction();
    try {
     $pdo->exec("INSERT INTO tcc_transaction (id, status) VALUES ('$transactionId', 'trying')");
     $pdo->exec("UPDATE account SET frozen_balance = frozen_balance + 100 WHERE user_id = 1");
     $pdo->commit();
    } catch (Exception $e) {
     $pdo->rollBack();
     throw $e;
    }

Confirm/Cancel 阶段实现

通过定时任务或消息队列触发后续操作:

// Confirm 示例
$pdo->beginTransaction();
try {
    $pdo->exec("UPDATE tcc_transaction SET status = 'confirmed' WHERE id = '$transactionId'");
    $pdo->exec("UPDATE account SET balance = balance - 100, frozen_balance = frozen_balance - 100 WHERE user_id = 1");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
}

// Cancel 示例
$pdo->beginTransaction();
try {
    $pdo->exec("UPDATE tcc_transaction SET status = 'cancelled' WHERE id = '$transactionId'");
    $pdo->exec("UPDATE account SET frozen_balance = frozen_balance - 100 WHERE user_id = 1");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
}

异常处理与重试机制

  • 幂等性设计:Confirm/Cancel 操作需支持重复执行。
  • 状态检查:通过定时任务扫描长时间处于 trying 状态的事务,触发补偿。
  • 日志记录:记录操作日志以便人工干预。

扩展建议

  1. 集成消息队列:使用 RabbitMQ 或 Kafka 异步触发 Confirm/Cancel。
  2. 使用框架:结合 Laravel 的队列系统或 Swoole 实现高性能调度。
  3. 分布式锁:防止并发操作导致资源冲突。

通过以上步骤,PHP 可实现基本的 TCC 模式,适用于电商、金融等需要最终一致性的场景。

php 实现tcc

标签: phptcc
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…