고정 자물쇠 사례 2

1. 환경 설명
MySQL5.6.33, 격리 단계는 RR이다.테이블 구조 및 데이터:
Create table t1(id int not null primary key auto_increment,c1 int,c2 int,c3 int, unique key(c1),unique key(c2));
insert into t1(c1,c2,c3) values(1,3,4),(6,6,10),(9,9,14);

2. 테스트 용례
session1
session2
session3
begin;
begin;
begin;
insert into t1 (c1,c2,c3) values(4,4,1);
insert into t1 (c1,c2,c3) values(4,4,2);
insert into t1 (c1,c2,c3) values(4,4,3);
commit;
Update t1 set c3=5 where c1=4;
update t1 set c3=5 where c1=4;
3、사쇄일지
------------------------
LATEST DETECTED DEADLOCK
------------------------
2018-07-07 06:27:15 a347bb90
*** (1) TRANSACTION:
TRANSACTION 7973, ACTIVE 43 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 320, 2 row lock(s)
MySQL thread id 4, OS thread handle 0xa34acb90, query id 75 localhost root updating
Update t1 set c3=5 where c1=4
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 18 page no 4 n bits 72 index `c1` of table `yzs`.`t1` trx id 7973 lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000004; asc     ;;
1: len 4; hex 80000006; asc     ;;
*** (2) TRANSACTION:
TRANSACTION 7974, ACTIVE 33 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 320, 2 row lock(s)
MySQL thread id 5, OS thread handle 0xa347bb90, query id 76 localhost root updating
Update t1 set c3=5 where c1=4
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 18 page no 4 n bits 72 index `c1` of table `yzs`.`t1` trx id 7974 lock mode S
Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000004; asc     ;;
1: len 4; hex 80000006; asc     ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 18 page no 4 n bits 72 index `c1` of table `yzs`.`t1` trx id 7974 lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000004; asc     ;;
1: len 4; hex 80000006; asc     ;;
*** WE ROLL BACK TRANSACTION (2)

4、사쇄일지 분석
사쇄 로그에서 볼 수 있는 것은 다음과 같습니다.
TRANSACTION 7973:
Update t1 set c3=5 where c1=4 문장이 2단계 색인 c1(4,6)에 있는 X 형식의 레코드 잠금 대기 (lock mode X locks rec but not gap)
TRANSACTION 7974:
2단계 인덱스 c1(4,6)에 있는 S-타입의next key 자물쇠(lock mode S), 신청 대기(4,6)에 있는 레코드 자물쇠(lock mode X locks rec but not gap)
그러나 자물쇠 로그에서 두 개의 업데이트 문구만 서로 기다리고 업무 논리적인 장면을 모르면 원인을 찾기 어렵다.
주: 여기 궁금한 게 있는데 왜 메인 키가 6이지, 4가 아니지?이것은 자가증가 키와 관련이 있기 때문에 자가증가에 대해 많은 고려를 하지 않고 흥미로운 자가테스트 분석을 한다.
5. 잠금 원리
1) insert의 유일한 키 잠금 시 반복 키 판단에 대한 S타입next-key 잠금의 잠금 원리는 이전 블로그 참조:
          https://blog.csdn.net/yanzongshuai/article/details/79326637
그리고https://blog.csdn.net/yanzongshuai/article/details/79301868
여기에 S 형식의next 키 잠금이 반복될 때, 어떤 격리 단계든지 이러한 잠금이 추가됩니다.
2) 암시적 잠금 변환 명시적 잠금 프로세스는 이전 블로그를 참조하십시오.
        https://blog.csdn.net/yanzongshuai/article/details/79306514
        https://blog.csdn.net/yanzongshuai/article/details/79254031
        https://blog.csdn.net/yanzongshuai/article/details/79252679
3) 업데이트 잠금 원리는 이전 블로그 참조:
       https://blog.csdn.net/yanzongshuai/article/details/80870949
       https://blog.csdn.net/yanzongshuai/article/details/80870957
       https://blog.csdn.net/yanzongshuai/article/details/80872095
6. 해석
1)session1은 insert into t1(c1,c2,c3)values(4,4,1)를 실행한다.실제로는 어떤 자물쇠도 넣지 않았다.
2)session2는 insert into t1(c1,c2,c3)values(4,4,2)를 실행한다.2단계 인덱스(4)와session1의 충돌로session1의 스텔스 자물쇠를 현식 자물쇠로 변환하기;유일한 충돌이 발생하면 (4) S 형식의next 키 자물쇠를 추가합니다. 이때session1은 X 자물쇠를 추가하여 기다립니다.
3)session3은 insert into t1(c1,c2,c3)values(4,4,3)를 실행한다.같은 이치로session1이 2단계 색인 c1(4)의 X 자물쇠를 방출하기를 기다리고 S 형식의next 키 자물쇠를 신청합니다.
4)session1이commit을 실행한 후session2와session3이 오류를 보고했습니다. ERROR 1062(23000): Duplicate entry'4'for key'c1'이며 S타입의next key 자물쇠를 신청합니다.
5)session2는 Update t1 set c3=5 where c1=4를 실행합니다.이전 블로그에서
          https://blog.csdn.net/yanzongshuai/article/details/80872095
검색 단계에서 2단계 색인 기록(4)에 대해 X 형식의 기록 자물쇠를 신청할 수 있음을 알 수 있습니다.session3은 S 형식next 키 자물쇠를 가지고 있기 때문에 기다림이 발생합니다.
6) session3에서 Update t1 set c3=5 where c1=4를 다시 실행합니다.마찬가지로 X 형식의 기록 자물쇠를 신청하고session2가 S 형식의next 키 자물쇠를 풀기를 기다립니다.이때 사라진 자물쇠가 발생합니다.
7. 해결 방법
양기용 선생님은 insert on duplicate key 문구를 사용하여 원래의 insert 문구를 대체할 수 있다고 설명했다.이 두 문장의 자물쇠가 다르니 관심 있는 것은 연구해 볼 만하다.
8. 참조
https://mp.weixin.qq.com/s/96CDhpgu5uUQ7qKYhKgt3w

좋은 웹페이지 즐겨찾기