비 블로킹 환경 에서이 MySQL/InnoDB 교착 문제를 해결하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/870097

  •  22-08-2019
  •  | 
  •  

문제

우리는 InnoDB 엔진 저장소와 함께 MySQL을 사용하고 있습니다. 테이블에 여러 개의 동시 요청을 보내는 "이벤트"환경이 있습니다. 기본적으로 다음과 같이 작동합니다 : 우리는 다음과 같은 find_or_insert 함수를 가지고 있습니다. -find () -> result, nimp on in insert-> on result find find ()

우리는 비 블로킹 MySQL 드라이버를 사용하고 있으므로 기본적 으로이 작은 알고리즘을 동시에 두 번 이상 시작할 때 첫 번째 결과를 삽입하기 전에 모든 발견을 실행합니다 ... 등.

불행히도, 우리는 다음과 같은 오류를 얻습니다. "잠금을 얻으려고 할 때 교착 상태가 발견되었습니다.

누구든지 도와 줄 수 있습니까?

EDIT] : 또한 MySQL이 새로운 요소를 여기에 삽입하기 위해 테이블을 잠금 해야하는 이유를 실제로 이해하지 못합니다. 처음에는 자동 점수가 여기에있는 범인 이었지만 제거했습니다 ... BU는 여전히 오류가 발생합니다. MySQL이 인서트의 테이블을 잠그지 않도록하는 방법이 있습니까?

도움이 되었습니까?

해결책

시도해보십시오 MySQL 참조 매뉴얼 진단 및 해결을 위해. 캐시를 만드는 것처럼 들립니다. 가능한 이유는 많은 클라이언트가 동시에 '첫 번째 버전'을 만들려고 테이블을 쳤기 때문일 수 있습니다 (즉, '빈 삽입물'을 쳤다). 아마도 의사 랜덤 지연을 추가하거나 제작자를 조정하여 동시에 DB에 대한 통화를 많이받지 못하도록 할 수 있습니까?

편집 : 본 적이 있습니다 이것 페이지? InnoDB로 테이블 당 잠금을 비활성화하려면 my.cnf 설정을 설정 해야하는 것 같습니다. 그러나 내가 주로 제안했던 것은 현실적인 상황보다 훨씬 높은 비율의 작가를 포함 할 수 있기 때문에 시험이 대표되지 않을 수 있다는 것입니다. 빈 테이블로 100 개의 스레드를 시작하면 모두 같은 값에 대해서도 즉각적으로 차단됩니다 (아마도 같은 값에 대해서도). 이것은 열쇠에 더 잘 퍼져 있고, 미스가 적고, 더 높은 비율의 판독 값을 가진 평균 상황보다 훨씬 나쁩니다. 이것이 예상되는 행동이라면 (즉,이 동작을 실시 할 것입니다), 제작 진술에 백 오프 전략을 추가하는 것이 좋습니다.

다른 팁

한 번에 하나씩 발생하려면 이러한 요청이 필요하므로 차단하지 않은 드라이버 사용을 중단 할 수 있습니다. 또는 자신의 차단 메커니즘을 구현하십시오. 다음으로 넘어 가기 전에 한 사람이 끝날 때까지 기다리십시오.

당신은 이것이 불합리하거나 어떤 이유로 든 이런 것들이 너무 빨리 움직일 필요가 있다고 말하지 않았습니다.

질문이 개정된다는 것을 반영하기 위해 대답을 변경하고 있습니다. 이제 이것은 동시 인서트의 문제 일 뿐이며 찾기 동작에 대한 의존성이 아닙니다.

InnoDB가 인서트에서 행 잠금을 수행하고이를 끄질 수 없다는 것은 내 이해입니다. 그러나 [편집]은 삽입 지연을 사용할 수 없습니다. 나는 이것을 Innodb에서 사용할 수 없다는 것을 읽었습니다.

http://dev.mysql.com/doc/refman/55.0/en/insert-delayed.html

아마도 모든 쓰기 주변의 명백한 잠금 테이블은 총체적으로 기본 잠금 동작을 무시할 것입니다. 쓰기 이벤트가 발생하는 간격 동안 테이블에 다른 작업이 없으면 작동 할 수 있습니다.

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top