2012-09-15 3 views
11

갑자기 우리가 같은 활동 기록을 통해 잠금 오류를 얻고있다 (관련 코드를 변경하지 않고) : 우리는 우리 자신의 트랜잭션을 수행하지 않는레일즈에서 MySQL 잠금 타임 아웃 오류를 어떻게 해결할 수 있습니까?

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE `items` SET `state` = 'reserved', `updated_at` = '2012-09-15 17:58:21' WHERE `items`.`id` = 248220 

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: DELETE FROM `sessions` WHERE `sessions`.`id` = 41997883 

중 이 모델들 중에서 유일한 트랜잭션은 레일스에 내장되어 있습니다. 트래픽이나 요청량이 급증하지 않았습니다.

이러한 오류는 "새"쿼리가 잠긴 테이블에서 실행하려고 시도하고 기다려야 할 때 나타나는 것처럼 보입니다. 대기중인 것을 어떻게 확인할 수 있습니까? 코드의 어느 부분이 오랫동안 테이블을 잠그는 쿼리를 실행하는지 파악하려면 어떻게해야합니까?

어디서 볼 수 있는지 또는 그 원인을 조사하는 방법에 대한 아이디어가 있으십니까?

+0

다음과 같이 갭 잠금을 해제하는 방법을 시도해 볼 수 있습니다 : innodb_locks_unsafe_for_binlog = 1, 어떤 팬텀 레코드가 발생할 수 있습니다. 그것에 대해 더 읽으십시오 [here] (http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_locks_unsafe_for_binlog) – Yarneo

+0

기본 DB 엔진이란 무엇입니까? INNODB에 'show innodb status'를 게시 할 수 있습니까? – ethrbunny

+0

SHOW ENGINE INNODB STATUS https://gist.github.com/3758910 – chrishomer

답변

3

pt-deadlock-logger를 살펴보면 레일스와 직접 관련이 없지만 발생하는 교착 상태에 대한 상당한 정보를 얻을 수 있습니다. http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

이 도구는 매우 간단하고 유용

http://www.percona.com/doc/percona-toolkit/2.1/pt-deadlock-logger.html

몇 가지 예제와 함께 좋은 작성자가있다. 그것은 SHOW ENGINE INNODB STATUS의 출력을 감시하고 새로운 교착 상태를 나중에 검토 할 수있는 파일이나 테이블에 기록합니다. 예제를 통해 어떻게 작동하는지 살펴 보겠습니다.

기사는 나는 또한에 대한 의견 접두사 쿼리에 도움이 발견했습니다

이 등 개최 관련 질의, 스레드 식별자로 교착 상태에 대한 정보를 기록 할 수있는 설명에 간다 파일이나 모듈, 기능, 심지어 어떤 사용자와 같은 추적을 허용합니다. 쿼리 주석은 일반적으로 이와 같은 진단 도구로 전달되며 코드의 어떤 부분과 어떤 상황에서 교착 상태가 발생하는지 추적하는 데 도움이 될 수 있습니다.

관련 문제