programing

PDO 거짓 양의 교착 상태

linuxpc 2023. 9. 13. 22:21
반응형

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를 가정합니다.그 이야기는 다음과 같습니다.

  1. 첫 번째 트랜잭션: 테이블 x1에 행 삽입;
  2. 두 번째 트랜잭션: TRUNCATE 테이블 x2; (잠금 대기)
  3. 첫번째 트랜잭션: 테이블 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

반응형