当前位置:首页 > PHP

php 实现tcc

2026-01-29 13:58:10PHP

php 实现tcc

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 ON UPDATE CURRENT_TIMESTAMP
);

Try 阶段实现

  1. 生成全局事务 ID 并记录状态为 trying
  2. 执行业务检查(如库存检查),预留资源(如冻结库存)。
    function tryOperation($orderId, $amount) {
     $transactionId = uniqid();
     // 记录事务状态
     DB::insert('INSERT INTO tcc_transaction (id, status) VALUES (?, ?)', [$transactionId, 'trying']);
     // 业务操作:冻结资源
     DB::update('UPDATE account SET frozen = frozen + ? WHERE user_id = ?', [$amount, $userId]);
     return $transactionId;
    }

Confirm 阶段实现

  1. 检查事务状态是否为 trying
  2. 提交资源(如扣减冻结金额)。
  3. 更新事务状态为 confirmed
    function confirmOperation($transactionId) {
     $status = DB::select('SELECT status FROM tcc_transaction WHERE id = ?', [$transactionId]);
     if ($status !== 'trying') {
         throw new Exception("Invalid transaction state");
     }
     // 提交业务操作
     DB::update('UPDATE account SET balance = balance - frozen, frozen = 0 WHERE user_id = ?', [$userId]);
     DB::update('UPDATE tcc_transaction SET status = ? WHERE id = ?', ['confirmed', $transactionId]);
    }

Cancel 阶段实现

  1. 检查事务状态是否为 trying
  2. 释放预留资源(如解冻金额)。
  3. 更新事务状态为 cancelled
    function cancelOperation($transactionId) {
     $status = DB::select('SELECT status FROM tcc_transaction WHERE id = ?', [$transactionId]);
     if ($status !== 'trying') {
         throw new Exception("Invalid transaction state");
     }
     // 回滚业务操作
     DB::update('UPDATE account SET frozen = 0 WHERE user_id = ?', [$userId]);
     DB::update('UPDATE tcc_transaction SET status = ? WHERE id = ?', ['cancelled', $transactionId]);
    }

注意事项

  1. 幂等性:确保 Confirm/Cancel 操作可重复执行而不产生副作用。
  2. 重试机制:通过定时任务补偿未完成的事务(如长时间处于 trying 状态的事务)。
  3. 隔离性:业务表需设计冻结字段(如 frozen),避免脏读或并发冲突。

通过以上步骤,PHP 可实现基本的 TCC 事务模式,适用于订单、支付等分布式场景。

标签: phptcc
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…