2012-11-01 6 views
8

InnoDB 테이블을 사용하여 MySQL 데이터베이스에 구축 된 시스템을 상속 받았습니다. 시스템에 과부하가 걸리는 버그가 있습니다. 나는 통제 된 환경에서 버그를보기를 희망하는 시스템을로드하기 위해 몇 가지 jmeter 테스트를 만들었다. 그러나, 나는 시스템을 올바르게 강조하지 않으며 버그가 결코 나타나지 않습니다. 현재의 이론은 과도하게 잠긴 테이블이 롤백을 유발하여 사용자의 데이터를 홀수 상태로 유지한다는 것입니다. 이것은 트랜잭션이 올바르게 구조화되지 않았으므로 그 트랜잭션을 찾아서 수정하려고하지만 문제를 먼저 찾아야합니다.테이블 잠금 문제 시뮬레이션

데이터베이스에서 다양한 "테이블 잠금로드"를 만들 수 있다면 시뮬레이트 된 사용자를 전체 시스템에서 실행할 수 있고 버그가 발생하도록 강제하거나 이론을 잘못 입증 할 수 있다고 추측합니다. 그러나 확실하지 않습니다 그런 것을 만드는 법. 누구나 최선의 방법에 대한 아이디어가 있습니까? 이 시점에서 나는 가난한 첫 번째 버전이 어떻게 생겼는지조차 알지 못하기 때문에 나를 시작하게하는 어떤 아이디어라도 도움이 될 것입니다. 감사!

+0

지금까지 SELECT ... FOR UPDATE를 수행하고 용의자 테이블에서 관심있는 행을 업데이트하는 jmeter "test"를 만들었습니다. 지금까지는 버그를 재현 할 수 없었지만 이것이 가능할 것으로 보이는 유일한 방법입니다. –

답변

5

테이블의 행에 대해 잠긴 상태를 찾고있는 경우 (즉, 테이블 자체를 변경하는 경우를 제외하고는 이것이 의미하는 것으로 가정합니다). 두 번째 스크립트에서 일련의 행에 대해 트랜잭션을 시작한 다음 일정 기간 롤오버하거나 트랜잭션을 커밋하기 전에 일시 중지하도록함으로써이를 구현할 수 있습니다.

CREATE TABLE `allkindsofvalues` (
    `value1` int(11) NOT NULL, 
    `value2` int(11) NOT NULL, 
    `irrelevant_value3` int(11) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

는 MySQL의 프롬프트를 열고 트랜잭션을 시작 :

BEGIN; 

UPDATE allkindsofvalues SET irrelevant_value3 = '32143234232'; 

지금 응용 프로그램을 불

는 예를 들어,이 테이블 구조를 갖고 있다고 할 수 있습니다. 이 시점에서 이러한 행을 사용하려고 시도하면 시작된 트랜잭션이 완료 될 때까지 기다릴 것입니다.

MySQL 프롬프트에서 트랜잭션을 COMMIT 또는 ROLLBACK하는 순간 모든 것이 정상적으로 계속되어야하지만 그 시점까지는 행이 잠긴 상태가되어 액세스 할 수 없습니다. 그것은 당신이 복제하려고하는 조건입니다.

+0

감사합니다, 셰인, 그럴 것 같은데, 나는 그것을 설정하고 시도해 볼 것입니다. 잠긴 내용과 잠긴 시간을 추적 할 수있는 방법이 있습니까? 내 버그를 탐지하기 위해 쿼리를 로깅했지만 문제를 격리하는 데 충분한 정보 자체가 아닌 것으로 보이며 많은 쿼리가 있습니다. –

+0

잘 작동하고 부서지기 쉬운 코드를 찾는 좋은 방법 인 것처럼 보이므로 답변을 수락했습니다. 이것에 대해 자세히 설명하고 잠금이 자주 발생하지만 지속적으로 발생하지 않는 실제 상황에 가까운 시뮬레이션을하는 jmeter 테스트를 생성 할 수 없는지 확인합니다. 감사! –