这篇文章主要介绍如何解决php数据库事务遇到的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
公司主营业务:网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出环江免费做网站回馈大家。
在使用php的PDO扩展的时候发现的一个问题,在事务开启之后,如果php与MySQL之间的连接断开了,会导致php直接记录一个warning的异常,而不是直接抛出一个Exception
流程如下:
/** * 一个用户财产变更的场景下 */ 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并进行了统计,但是实际上用户的财产并没有增加。从而导致了问题
百思不得其解的时候去看了下文档,发现了一个历史遗留很久的bug:https://bugs.php.net/bug.php?...
后来我们通过临时在事务的位置配置了set_error_handler
解决了问题
以上是如何解决php数据库事务遇到的问题的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!