2009-05-15 3 views
1

Innodb 엔진 스토리지와 함께 MySQL을 사용하고 있습니다. 테이블에 여러 개의 동시 요청을 보내는 "이벤트가 발생한"환경이 있습니다. 는 기본적으로, 그것은 다음과 같이 작동 우리가 수행하는 find_or_insert 기능이 있습니다 - 찾기() -> 결과에 비어있는 경우 - 우리가 사용하고있는비 차단 환경에서 MySQL/Innodb 교착 상태 문제를 어떻게 수정합니까?

> 결과 발견()에서 -> 를 삽입 비 블로킹 MySQL 드라이버이므로 기본적으로이 작은 알고리즘을 동시에 두 번 이상 시작하면 첫 번째 결과를 삽입하기 전에 모든 검색이 실행됩니다.

불행히도 다음과 같은 오류가 발생합니다. "잠금을 시도 할 때 교착 상태가 발견되어 트랜잭션을 다시 시작하십시오."

사람 그걸 도울 수 있니?

[편집] 또한, 실제로 MySQL이 여기에 새로운 요소를 삽입하기 위해 테이블을 잠글 필요가 있는지 이해할 수 없습니다. 처음에는 자동 증가가 범인 이었지만 나는 그것을 제거했습니다 ... bu 여전히 오류가 있습니다. MySQL이 삽입 테이블을 잠글 수 없게하는 방법이 있습니까?

+0

처음에이 질문에 유용한 제목을 찾으십시오. – VVS

+0

아야! 좋아, 나는 더 의미있는 것으로 그것을 바꿀 것이다. –

답변

1

진단 및 해결을 위해 mysql reference manual을 시도하십시오. 캐시를 만드는 것처럼 들립니다. 가장 많은 이유는 많은 수의 클라이언트가 동시에 '첫 번째 버전'을 만들려고 테이블을 쳤다는 것입니다 (즉, '빈 삽입'인 경우). 어쩌면 의사 랜덤 지연을 추가하거나 작성자를 조정하여 db에 대한 동시 호출을 많이 생성하지 않을 수도 있습니다.

편집 : this 페이지를 본 적이 있습니까? 당신이 innodb로 테이블 당 잠금을 해제하도록 my.cnf 설정을 설정해야하는 것처럼 보입니다. 제가 주로 제안한 것은 현실적인 상황보다 훨씬 높은 비율의 작가를 포함 할 수 있기 때문에 테스트를 표현할 수 없을 수도 있다는 것입니다. 빈 테이블이있는 100 개의 스레드를 시작하면 모든 값이 생성시 즉시 차단됩니다 (같은 값의 경우에도 가능). 이것은 키에 대한 퍼짐이 좋고, 누락이 적으며, 읽는 비율이 훨씬 높은 평균적인 상황보다 훨씬 나쁩니다. 예상되는 동작 (즉,이 동작을 실시간으로 수행하는 경우) 인 경우 create 문에 백 오프 전략을 추가하는 것이 좋습니다.

+0

기술적으로는 캐시가 아니지만 메커니즘은 비슷합니다 ... 그러나 제 경우에는 모든 요청이 다른 행을 가져 오거나 삽입합니다 ... –

+0

Karl에게 남긴 변경 사항과 의견을 반영하기 위해 답변을 편집했습니다. 테이블 잠금 장치가 보이거나 동일한 행에 여러 개의 삽입 장치가 있습니까? –

+0

그들은 테이블 잠금 장치입니다 ... –

0

이러한 요청은 한 번에 하나씩 발생해야하므로 비 차단 드라이버를 사용하지 마시기 바랍니다. 또는 독자적인 차단 메커니즘을 구현하십시오. 하나가 끝날 때까지 기다렸다가 다음 단계로 넘어갑니다.

당신은 이것이 무리하거나, 어떤 이유로 이러한 것들이 너무 빨리 움직일 필요가 없다고 말하지 않습니다.

+0

번개 속도가 필요하기 때문에 블로킹 드라이버를 사용할 수 없습니다 ... 응용 프로그램은 실제로 초당 수천 개의 연결을 처리해야하는 XMPP 응용 프로그램이며 대부분은 데이터베이스를 만져서 데이터베이스 때문에 모든 사람을 정말로 차단할 수는 없습니다. –

0

질문이 개정되었음을 반영하여 답변을 변경하고 있습니다. 이것은 이제 동시 삽입에 대한 문제 일 뿐이며 찾기 동작에 대한 종속성이 아닌 것처럼 들립니다.

InnoDB는 삽입에 행 잠금을 수행하고 이것을 해제 할 수 없다는 것을 이해합니다. 그러나 당신은 INSERT DELAYED를 사용할 수 없습니다. 나는 InnoDB에서 사용할 수 없다는 것을 읽었다.

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

아마도 당신의 쓰기의 주위에 명시 적 LOCK 테이블은 총체적으로 기본 잠금 동작을 재정의합니다. 쓰기 이벤트가 발생하는 간격 동안 테이블에 다른 작업이 없으면이 작업이 수행 될 수 있습니다.

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