고유 한 키 필드에 값을 삽입하기 위해 ISAM 테이블을 잠그야합니까?

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

문제

MySQL에 ISAM 테이블이 있습니다.

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

이 테이블에 행을 삽입하는 여러 프로세스가 있습니다. 두 프로세스가 동일한 "이름"을 삽입하려고하면 그 중 하나가 오류가 발생하거나 "이름"이 일치하는 행을 찾아야합니다.

테이블을 잠그고 잠금 장치에서 이름이 존재하지 않도록해야합니까, 아니면 서버에 의존해야합니까?

나는 교착 상태에 빠지고 싶지 않기 때문에 자물쇠를 사용하는 것이 약간 주저합니다.

도움이 되었습니까?

해결책

잠금을 방해하지 마십시오. 색인은 복제를 방지합니다. 응용 프로그램에서 오류 코드를 처리해야합니다.

MySQL은 고유 한 주요 제약 조건을 위반할 때 1062 (또는 SQLSTATE 23000)의 오류 코드를 반환해야합니다.

다른 팁

그건 그렇고, 교착 상태에 대한 두려움을 설명하면, 원인은 명확하게 이해되지 않을 수 있습니다 (질문에 설명 된 것보다 쿼리에 더 많은 것이 없다면).

좋은 다른 사람이 쓴 요약:

  1. 쿼리 1은 자원을 잠그면서 시작합니다
  2. 쿼리 2는 자원을 잠그면서 시작합니다. b
  3. 쿼리 1은 계속하려면 리소스 B에 잠금이 필요하지만 쿼리 2는 해당 리소스를 잠그고 있으므로 쿼리 1이 출시되기를 기다리기 시작합니다.
  4. 그 동안 쿼리 2는 완료하려고하지만 마무리하려면 리소스 A에 잠금이 필요하지만 쿼리 1에 잠금 장치가 있기 때문에이를 얻을 수는 없습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top