关于php数据库事务的一个坑

10次阅读

共计 583 个字符,预计需要花费 2 分钟才能阅读完成。

在使用 php 的 PDO 扩展的时候发现的一个问题,在事务开启之后,如果 php 与 mysql 之间的连接断开了,会导致 php 直接记录一个 warning 的异常,而不是直接抛出一个 Exception
流程如下:
/**
* 一个用户财产变更的场景下
*/

try {
// 1. 开启事务

/**
* 2. 变更用户财产,增加财产变更的流水记录
*/

// 3. 提交事务
} catch (\Exception $e) {
// 4. 记错误日志

// 5. 抛出异常
}

// 6. 发布用户财产变更的广播

以上的操作可以简单的分成五类,在以前我的认知当中,操作事务的大致流程就是上面的样子,没有异常抛出则事务就是提交成功了的但是直到有一天数据库异常,有一个事务已经开启了,处在上面的 1 - 2 的过程当中,数据库直接挂掉,那么在步骤 3 提交事务的时候会直接出现一个 warning 级别的错误,”SQLSTATE[HY000]: General error: 2006 MySQL server has gone away” , 没有捕获到异常所以在步骤 6 的后续步骤中,其他业务方拿到了那条没有提交的流水 id 并进行了统计,但是实际上用户的财产并没有增加。从而导致了问题
百思不得其解的时候去看了下文档,发现了一个历史遗留很久的 bug:https://bugs.php.net/bug.php?…
后来我们通过临时在事务的位置配置了 set_error_handler 解决了问题

正文完
 0