2009-11-15 1 views
0

4 백만 개가 넘는 레코드가있는 트랜잭션 테이블에서 실행되는 Select 쿼리가 있습니다. 이 쿼리를 실행할 때마다 특정 트랜잭션 테이블의 모든 쓰기 및 업데이트 작업이 일시 중단되고 잠금 대기 시간 초과를 초과하는 Java 측에서 예외가 발생하기 시작하면 트랜잭션을 다시 시작하십시오. 현재 잠금 대기 시간 초과는 200 초로 설정됩니다. select 문이 테이블에서 이러한 잠금을 만들고 모든 삽입/업데이트 문을 차단할 수있는 이유를 이해할 수 없습니다. 테이블 스토리지 엔진은 InnoDb이고 기본 키는 자동 증가 키입니다. MySQL 버전은 5.1.40입니다. 또한 select 문을 실행하기 전에 트랜잭션을 시작하지 않습니다.Select 문은 InnoDB 테이블에서 읽기/쓰기 작업을 차단합니다.

아이디어가 있으십니까?

+0

은 당신이 쿼리에 EXPLAIN 봤어 모델을 이해하는 데 도움이 될 수 있습니다? 뭐라고 했지? –

+0

예 설명을 시도했습니다. 그것은 모든 인덱스가 타격을 가하는 것을 보여줍니다. – Anees

답변

0

예, 하나의 트랜잭션에서 SELECT가 해당 테이블의 레코드를 읽기 잠금하고 동일한 레코드를 터치하는 쓰기 작업은 읽기 트랜잭션이 완료 될 때까지 대기해야합니다 (2 단계 잠금을 따른 경우).

This document은 InnoDB의 잠금

관련 문제