当前位置:首页 > 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实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…