2014-12-13 3 views
-1

하고 거래는 사용자 정의 유형의 오류를 기대하는 것입니다거래 코드를 작성하는 적절한 방법은 무엇입니까? 여러 스레드 또는 프로세스와 동일한 데이터베이스 및 테이블에서

잠금 대기 제한 시간을 초과; MySQL의에서 오는

거래

를 다시 시작하려고?
이 작업은 값 비싼 작업으로 인해 블로킹의 경우처럼 교착 상태를 나타내지 않습니다. 나는 내가 PK의 배치를 할당하는 대신에 의해 많은 스레드에서 삭제를 분리 빠를 이러한 테이블에서 삭제하고 싶었 더 컨텍스트를 들어

BEGIN 
DELETE FROM TableA where pk = X 
DELETE FROM TableC where colA = X 
DELETE FROM TableD where colA = X 
DELETE FROM TableE where colA = X 
DELETE FROM TableF where colA = X 
COMMIT 

: 내 경우
나는 다음과 같은 코드 구조 발견 순차적으로 단일 스레드를 통해 수행합니다. 근본적으로 내가 말할 수있는 한 교착 상태가 될 수 없다. (내가 틀렸다면 나를 교정 해주세요).
그래서 내가 생각하는 문제는 스레드 중 하나가 너무 오랫동안 삭제를 시도하여 차단되었다는 것입니다.
응용 프로그램 수준에서이 사건을 어떻게 처리해야하는지 (오류 msg에 따르면) 것 같습니다.
그래서 내 질문은 : 트랜잭션을 수행하는 코드를 작성할 때 하나는 일반적으로 이러한 오류를 기대 예를 들면 몇 초 동안 기다리과 거래를 몇 번을 다시 시도 할 필요가 다음 아마도 포기합니까?
이것이 트랜잭션에 대해 일반적으로 코드화하는 방법인지 확실하지 않습니다.
(참고 : 기본 설정 언어이므로 자바 질문이 아니지만 자바로 태그를 지정하고 있습니다.)

+0

외래 키와 계단식 삭제를 사용하지 않는 이유가 있습니까? –

+0

@ X.L.Ant : 그것은 현재의 디자인이며 변경할 수 없습니다. 계단식 삭제도 "긴"작업이기 때문에 동일한 문제가 발생한다고 생각하겠습니다. – Jim

+0

예, 동의합니다. 호기심에서 벗어났습니다. –

답변

1

당신이 맞아요 -이 교착과 같은 것은 아니다.

innodb_lock_wait_timeout 시스템 변수 http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout은 InnoDB하지만 포기하기 전에 행 잠금을 획득하기 위해 대기하는 시간을 결정하십시오.

귀하의 다중 스레드는 대부분 서로 기다릴 필요가 있으며,이 경우에, 당신은 여러 스레드 당신이 달성하려고하는지에 대한 유용한 방법인지 여부를 재고 있습니다.

일반적으로 이러한 오류는 행이 너무 오래 잠겨 있으면 일반적으로 문제의 징후가 될 수 있으므로 응용 프로그램에서 문제가있는 상태의 징후입니다. 트랜잭션 작업의 가장 좋은 방법은 들어가는 것, 가능한 한 빨리 다시 시작 (커밋 또는 롤백)하십시오. 분명히, 많은 수의 행에 대한 조작을 수행하는 경우에는 가능하지 않으므로 동일한 배타적 행 또는 색인 잠금을 필요로하는 다른 트랜잭션이 대기해야하므로 잠금 대기가 더 많이 발생할 수 있습니다.

+0

하지만 많은 수의 행에서 작업을 수행하지 않습니다. 하나의 트랜잭션에서 4 개의 테이블 각각에서 행을 삭제하는 20 개의 스레드가 있습니다. 나는. 각 20 개의 스레드에 대해 기본 키가 20000 개 있고 각 PK에 대해 OP 스 니펫에 트랜잭션을 실행합니다. – Jim

+0

흥미 롭습니다. 자체적으로 운영되는 경우 해당 트랜잭션 중 하나가 소요되는 시간은 얼마입니까? –

+0

나는 어떤 타이머도 추가하지 않았지만 내가 무엇을 기록하는지 콘솔에서보고있다. 로그에 따르면 각 스레드는 "논리적"레코드를 삭제한다는 것을 알 수있다. 물론 로그는 쓰레드가 하나씩 쓰여지는 "scrabbled"입니다. – Jim