2016-09-23 8 views
2

최근에 MySQL 5.7로 업그레이드하고 자주 발생하는 데드락 문제를 관찰했습니다. 이전에이 문제가 발생하지 않았기 때문에 5.7을 잠그는 것과 관련된 변경 사항이 있습니까?최근에 MySQL 5.7로 업그레이드하고 자주 발생하는 교착 상태를 관찰했습니다. 5.7에서 잠금과 관련된 변경 사항이 있습니까?

나는 자동 증가 된 id를 기본 키로 사용하고 unique_reference 열을 고유 인덱스로 두 개 더 추가하는 retry_records라는 간단한 테이블을 가지고 있습니다. 이 테이블은 코드 섹션이이 테이블에서 n 개의 레코드를 선택하고, 데이터를 처리하고 프로세스 실패시이 테이블을 업데이트하며, 다른 코드 섹션은 테이블에서 처리 된 레코드 몇 개를 삭제하는 완전 멀티 스레드 환경에서 사용되고 있습니다 코드 섹션에서이 테이블에 새 레코드를 삽입하고 있습니다. 모든 쿼리에는 조인이 없으며 일괄 처리 삽입, 일괄 업데이트, 일괄 삭제는 선택을 제외하고 있습니다. 모든 갱신/삭제/삽입 트랜잭션에는 단일 명령문이 있습니다. 그렇다면 삽입시 교착 상태를 관찰하고 있습니다.

------------------------ 
LATEST DETECTED DEADLOCK 
------------------------ 
2016-09-22 13:05:09 0x7f3f427e0700 
*** (1) TRANSACTION: 
TRANSACTION 39420432534, ACTIVE 0 sec inserting 
mysql tables in use 1, locked 1 
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 
MySQL thread id 37503, OS thread handle 139917976340224, query id 1695822465 

삽입 쿼리 ..

*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table `database_name`.`table_name` trx id 39420432534 lock_mode X insert intention waiting 
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 
0: len 8; hex 73757072656d756d; asc supremum;; 

*** (2) TRANSACTION: 
TRANSACTION 39420432524, ACTIVE 0 sec inserting 
mysql tables in use 1, locked 1 
6 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 1 
MySQL thread id 37494, OS thread handle 139909675222784, query id 1695822438 

또 다른 삽입 쿼리 ... 나는 비슷한 문제가 발생

*** (2) HOLDS THE LOCK(S): 
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table 


*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 1334 page no 1726952 n bits 312 index id of table 

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 
0: len 8; hex 73757072656d756d; asc supremum;; 
+0

제목이 1) 최근에 5.7로 업그레이드되었고, 2) 이전에 이러한 문제가 발생하지 않았다는 것을 의미하는 것으로 보입니다. 그것들이 사실이라면, 당신이 질문 한 내용과 당신이 업그레이드 한 버전을 직접 기술하십시오. 실제 쿼리와 'SHOW CREATE TABLE tablename' 출력은 다른 포인트가 참인지 여부에 관계없이 상처를주지 않을 것입니다. –

+0

Willem Renzema와 Ryan Vincent에게 답장을 보내 주셔서 감사합니다. 나는 질문과 관련된 몇 가지 세부 사항을 추가했다. 도와주세요. – Rahul

답변

0

: 다음은 로그입니다. 5.7부터 새로운 매개 변수 이름이 있습니다. innodb_deadlock_detect

이 옵션은 교착 상태 감지를 비활성화하는 데 사용됩니다. 동시성이 높은 시스템 인 에서는 많은 스레드가 동일한 잠금을 기다릴 때 교착 상태가 감지되면 속도가 느려질 수 있습니다. 때로는 교착 상태 감지시 교착 상태 감지를 비활성화하고 교착 상태가 발생할 때 트랜잭션 롤백을 위해 innodb_lock_wait_timeout 설정 에 의존하는 것이 더 효율적일 수 있습니다.

성능을 향상시키고 교착 상태 문제를 줄일 수 있습니다.