在使用php的PDO扩展的时候发现的一个问题,在事务开启以后,若是php与mysql之间的链接断开了,会致使php直接记录一个warning的异常,而不是直接抛出一个Exceptionphp
流程以下:mysql
/** * 一个用户财产变动的场景下 */ try { // 1. 开启事务 /** * 2. 变动用户财产,增长财产变动的流水记录 */ // 3. 提交事务 } catch (\Exception $e) { // 4. 回滚事务 // 5. 记错误日志 // 6. 抛出异常 } // 7. 发布用户财产变动的广播
以上的操做能够简单的分红五类,在之前个人认知当中,操做事务的大体流程就是上面的样子,没有异常抛出则事务就是提交成功了的
可是直到有一天数据库异常,有一个事务已经开启了,处在上面的1-2的过程中,数据库直接挂掉,那么在步骤3提交事务的时候会直接出现一个warning
级别的错误,"SQLSTATE[HY000]: General error: 2006 MySQL server has gone away" ,
没有捕获到异常
因此在步骤7的后续步骤中,其余业务方拿到了那条没有提交的流水id并进行了统计,可是实际上用户的财产并无增长。从而致使了问题sql
百思不得其解的时候去看了下文档,发现了一个历史遗留好久的bug:https://bugs.php.net/bug.php?...数据库
后来咱们经过临时在事务的位置配置了set_error_handler
解决了问题.net