2014-12-06 5 views
0

mysql에서 트랜잭션 격리 수준과 잠금에 관한 한 가지 질문이 있습니다.READ COMMITTED 잠금 대기 시간 초과가

나는 하나 개의 쿼리가 잠금 시간 제한 오류가 계속 있습니다

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 

쿼리는 기본적으로 특정 date_id 레코드를 삭제하려고합니다. BTW, date_id뿐만 아니라 인덱싱됩니다. 하지만 대부분의 경우 일치하는 레코드가 없으므로 아무 것도 삭제하지 않습니다.

조사한 결과 같은 테이블에서 범위를 선택하는 범용 장기 실행 쿼리가 원인 일 수 있음을 발견했습니다. 그러나, 나를 혼란스럽게하는 것은 "READ COMMITTED"라는 격리 수준에서 트랜잭션을 실행하는 것입니다. 그래서 자물쇠가 필요한 이유와 타임 아웃 할 수있는 이유에 대해 전혀 알지 못합니다 (특히 일치하는 레코드가없는 것으로 간주하십시오)

감사합니다.

+0

'SHOW INNODB STATUS'를 사용하여 어떤 종류의 SQL을 차단하는지 확인하십시오. –

+0

InnoDb 테이블 또는 MyIsam 테이블을 사용합니까? MyIsam 작성자는 독자를 차단하고 반대의 경우도 간단한 SELECT 문을 사용하여 쿼리와 관련된 모든 테이블에 잠금을 설정하고 작성자를 차단합니다. – krokodilko

답변

0

트랜잭션 격리 "읽기 커밋"은 계약입니다. 데이터베이스는 커밋 된 데이터를 읽고 트랜잭션에서 아직 커밋되지 않은 데이터 만 유지하도록 약속합니다. 잠금 시간 초과 오류는 런타임 오류입니다. 데이터베이스가 데이터를 업데이트하려고 시도하지만 좋은 순간을 찾을 수 없습니다 (MySQL 참조 설명서의 here 참조). 삭제할 데이터가 없더라도 데이터베이스는이를 확인하는 데 필요한 시간을 찾아야합니다.

트랜잭션 격리 "읽기 커밋"은 이미 데이터 업데이트를위한 좋은 순간을 찾기위한 가능성을 향상 시키지만 (예 : here 참조) 다른 쿼리/트랜잭션이 전체 테이블을 잠그는 것을 방지 할 수 없습니다 ("전체 테이블 검색" 당신의 범죄자 쿼리가 아마도 그렇듯).

좀 더 검색하면 삭제 문제로 possible solution이 표시됩니다.

관련 문제