PHP 事务怎么用

你在银行转钱时,不会想“刚输完密码就断电怎么办”——这种“要么全成、要么全不成”的情况,在程序里靠“事务”实现。对用PHP做项目的人来说,事务不是复杂的术语,就是帮你避免“钱扣了但对方没收到”这种麻烦的工具。

先搞懂:PHP事务管什么?

你可以把事务想象成“一次性打包做几件事的合同”:只要其中一件事失败,所有事都不算数;全成功,才正式生效。

PHP 事务怎么用

举个生活化的例子:你在网上买奶茶,会触发两个操作:从你的钱包扣15块,给商家的店铺加15块。要是这两步只做了一步——比如扣钱成功但商家没收到,你肯定会找平台申诉。PHP事务就是帮你拦住这种“半截子活”的:只有扣钱和加钱都成功,合同才算完成,不然就把操作全撤回,回到没操作之前的状态。

PHP里用事务的3步简单操作

PHP的事务不是凭空来的,得配合数据库(比如最常用的MySQL),而且只对支持事务的数据库表有效(用InnoDB引擎的表才可以,老的MyISAM不行)。操作就3步,每步都有明确的动作:

  • 先开启“打包”:这一步就是告诉数据库,“接下来的操作我要一起管,别随便生效”。
  • 要么一起“确认打包”:如果所有操作都没出错,就提交,把所有操作正式保存到数据库里。
  • 要么一起“退回打包”:只要有一步出错,就撤回所有操作,回到没开始打包的状态。

别担心记不住,给你写个能直接用的小例子——就用买奶茶的场景:

`php

// 假设你连了数据库,这个连接对象就像你和数据库的“办事窗口”

$pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码');

try {

// 第一步:开启事务,开始打包操作

$pdo->beginTransaction();

// 操作1:你的钱包扣15块,写进数据库

$pdo->exec("UPDATE wallet SET balance = balance -15 WHERE user_id = 123");

// 操作2:商家店铺加15块,写进数据库

$pdo->exec("UPDATE shop SET balance = balance +15 WHERE shop_id = 456");

// 这里可以加个小测试——如果是凌晨2点到4点,故意让操作出错(模拟异常)

if (date('H') >= 2 && date('H') <= 4) {

throw new Exception('凌晨交易系统维护,暂时不能下单');

}

// 第二步:全成功,提交打包,所有操作生效

$pdo->commit();

echo '奶茶购买成功!';

} catch (Exception $e) {

// 第三步:有问题,退回所有操作,相当于没扣钱也没加钱

$pdo->rollBack();

echo '购买失败:' . $e->getMessage();

}

`

用事务的2个关键细节

别以为写完代码就万事大吉,这两个细节不注意,事务就白用了:

第一,必须和异常绑定:上面的例子里用了try...catch,就是怕某一步出问题(比如数据库连不上、没找到用户),只要出现异常,立刻触发rollBack撤回操作。要是你忘了写catch,就算出问题,事务也不会自动退回,反而会留下“半截子操作”。

第二,事务不是万能的:比如你要调用第三方支付接口(比如微信支付),这种情况就不能只靠PHP事务——因为接口的操作不在你的数据库里,事务管不到,得用更复杂的流程保证两边状态一致。

其实PHP事务的核心逻辑,就是把“一堆事绑成一个整体”,只要记住“开事务、做操作、出问题就撤回,没问题就提交”,再结合具体的项目场景,就能用它解决大部分“半截子操作”的麻烦。

上一篇 C / C++ 编程语言的核心特性与开发场景全解析