이 기사의 내용은 PHP 데이터베이스 트랜잭션에서 발생하는 문제를 해결하는 것입니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.
php의 PDO 확장을 사용할 때 발견된 문제입니다. 트랜잭션이 열린 후 php와 mysql 사이의 연결이 끊어지면 php가 직접 예외를 발생시키는 대신 경고 예외를 직접 기록하게 됩니다
프로세스는 다음과 같습니다.
/** * 一个用户财产变更的场景下 */ try { // 1. 开启事务 /** * 2. 变更用户财产,增加财产变更的流水记录 */ // 3. 提交事务 } catch (\Exception $e) { // 4. 回滚事务 // 5. 记错误日志 // 6. 抛出异常 } // 7. 发布用户财产变更的广播
위 작업은 간단히 5가지 범주로 나눌 수 있습니다. 이전에 이해한 바에 따르면 트랜잭션을 수행하는 일반적인 프로세스는 위와 같습니다. 예외가 발생하지 않으면 트랜잭션이 성공적으로 제출됩니다.
하지만 하나가 있을 때까지입니다. 위의 1-2 과정에서 데이터베이스가 바로 정지됩니다. 그러다가 3단계에서 트랜잭션을 제출하면 바로 warning
수준의 오류가 나타납니다. , "SQLSTATE[HY000]: 일반 오류: 2006 MySQL 서버가 사라졌습니다." ,
예외가 포착되지 않았습니다warning
级别的错误,"SQLSTATE[HY000]: General error: 2006 MySQL server has gone away" ,
没有捕获到异常
所以在步骤7的后续步骤中,其他业务方拿到了那条没有提交的流水id并进行了统计,但是实际上用户的财产并没有增加。从而导致了问题
百思不得其解的时候去看了下文档,发现了一个历史遗留很久的bug:https://bugs.php.net/bug.php?...
后来我们通过临时在事务的位置配置了set_error_handler
따라서 7단계의 후속 단계에서 다른 비즈니스 당사자가 제출되지 않은 파이프라인 ID를 얻었고 통계이지만 실제로는 사용자의 속성이 증가하지 않았습니다. 이로 인해 문제가 발생했습니다
의아해했을 때 문서를 살펴보니 오랫동안 방치되어 있던 버그를 발견했습니다: https://bugs.php.net/bug.php?...
🎜나중에 트랜잭션 위치에서set_error_handler
를 임시로 구성하여 문제를 해결했습니다🎜🎜🎜위 내용은 PHP 데이터베이스 트랜잭션에서 발생한 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!