PDO 거짓 양의 교착 상태
우리는 PHP 7.0과 MariaDB 10.0에서 기본적인 웹 앱을 실행하고 있습니다.모든 쿼리는 PDO 클래스를 통해 데이터베이스로 들어갑니다.
문제는 PDO가 때때로 교착 상태 예외를 발생시킨다는 것입니다.
SQLSTATE[40001]:직렬화 실패: 잠금을 시도할 때 1213 교착 상태가 발견되었습니다. 트랜잭션을 다시 시작해 보십시오.
그러나 교착 상태 사양(SHOW Engine INNODB STATUS 사용)에 대해 MariaDB를 조사할 때 "마지막 교착 상태"는 실제 마지막 교착 상태가 아닙니다.예를 들어 2019-10-01년에 교착 상태가 나타났지만 PDO는 2019-10-05년에 마지막 교착 상태를 알려주었습니다.PDO가 교착상태를 만들고 있는 것 같습니다.하지만 다시 말하지만, 매번 그런 것은 아닙니다.그리고 MariaDB 속성 "Innodb deadlocks"(int)는 "SHOW ENGINNODB STATUS"에 마지막 교착 상태가 표시되지 않을 때 증가하지 않습니다.
지금은 한 번의 거래에 대해서만 발생하고 있습니다.트랜잭션의 모든 테이블은 InnoDB 엔진에서 실행됩니다.약 40개의 쿼리(선택, 업데이트, 삽입)입니다.MariaDB 속성 "innodb print all deadlock"이 켜져 있습니다.연결할 수 있는 데이터베이스 서버가 하나뿐입니다.
PDO는 데이터베이스에서 발생한 모든 오류를 보고하는 것뿐입니까? 아니면 "데드락을 구성"할 수 있습니까?아니면 PHP와 MariaDB의 오래된 버전의 문제일 수도 있습니까?저희는 업그레이드를 계획하고 있지만, 지금은 아닙니다.
그리고 확실한 것은, 지금의 교착상태를 해결하는 것이 아니라, 이 모든 비정상을 해결하는 것입니다.
편집: 현재 교착 상태가 PDO에 의해 "보완"되지 않았다는 것을 알게 되었습니다.진짜 교착 상태였지만 다른 트랜잭션(크론 작업)에서 "TRUNCATE"로 쿼리하는 것이 문제였습니다.
긴 설명:
x1 기본 키를 참조하여 표 x1과 표 x2를 가정합니다.그 이야기는 다음과 같습니다.
- 첫 번째 트랜잭션: 테이블 x1에 행 삽입;
- 두 번째 트랜잭션: TRUNCATE 테이블 x2; (잠금 대기)
- 첫번째 트랜잭션: 테이블 x1에서 삽입된 행을 업데이트합니다;
그리고 세번째 단계는 교착상태를 야기시켰습니다.비록 테이블 x1의 삽입 행의 기본 키가 테이블 x2에 있지는 않았지만 말입니다.표 x2는 방금 x1을 참조하고 있었습니다.
이 ㅇㅇTRUNCATEing
내용을 바꾸는 단계로 다음 항목으로 변경합니다.
CREATE TABLE x LIKE real;
load data into x
RENAME TABLE real TO old,
x TO real;
DROP TABLE old;
언급URL : https://stackoverflow.com/questions/58336283/pdo-false-positive-deadlock
'programing' 카테고리의 다른 글
Wordpress - 비밀번호 변경 시 사용자 알림 비활성화 (0) | 2023.09.13 |
---|---|
파워쉘을 이용한 window용 git client 다운로드 및 설치 방법 (0) | 2023.09.13 |
매개변수로서의 기능 전달 (0) | 2023.09.13 |
MySQL 개념: 세션 vs 연결 (0) | 2023.09.13 |
Perl-Mysql DBD를 설치하려고 하면 mysql_config를 찾을 수 없습니다. (0) | 2023.09.08 |