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