当前位置:首页 > PHP

php 实现tcc

2026-01-29 13:58:10PHP

php 实现tcc

TCC 模式简介

TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,适用于需要高一致性的场景。其核心思想是将事务拆分为三个阶段:

  • 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 事务模式,适用于订单、支付等分布式场景。

php 实现tcc

标签: phptcc
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session…

php实现搜索功能

php实现搜索功能

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

php实现验证码

php实现验证码

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

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 实现自动收货

php 实现自动收货

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

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…