>  기사  >  백엔드 개발  >  PHP 데이터베이스 트랜잭션에서 발생한 문제 해결

PHP 데이터베이스 트랜잭션에서 발생한 문제 해결

不言
不言앞으로
2019-04-13 11:38:052846검색

이 기사의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제