고정 자물쇠 사례 3

1. 환경 설명
MySQL5.6.33, 격리 단계는 RR이다.테이블 구조 및 데이터:
create table t2 (
  id int primary key auto_increment ,
  c1 int ,
  c2 int ,
  key (c1)
) engine=innodb ;
insert into t2 values(24,3,4),(25,3,4),(26,3,4),(30,5,8);

2. 테스트 용례
session1
session2
begin;
begin;
select *from t2 where id=30 for update;
update t2 set c2=8 where c1=5;
delete from t2 where id=30;
deadlock
3、사쇄일지
LATEST DETECTED DEADLOCK
------------------------
2018-07-14 06:45:32 a3522b90
*** (1) TRANSACTION:
TRANSACTION 8976, ACTIVE 104 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 2, OS thread handle 0xa34f1b90, query id 28 localhost root Searching rows for update
update t2 set c2=8 where c1=5
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 19 page no 3 n bits 72 index `PRIMARY` of table `yzs`.`t2` trx id 8976 lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 00000000230f; asc     # ;;
 2: len 7; hex 0d000001410943; asc     A C;;
 3: len 4; hex 80000005; asc     ;;
 4: len 4; hex 80000008; asc     ;;

*** (2) TRANSACTION:
TRANSACTION 8975, ACTIVE 251 sec updating or deleting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 320, 2 row lock(s), undo log entries 1
MySQL thread id 1, OS thread handle 0xa3522b90, query id 29 localhost root updating
delete from t2 where id=30
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 19 page no 3 n bits 72 index `PRIMARY` of table `yzs`.`t2` trx id 8975 lock_mode X locks rec but not gap
Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 00000000230f; asc     # ;;
 2: len 7; hex 0d000001410943; asc     A C;;
 3: len 4; hex 80000005; asc     ;;
 4: len 4; hex 80000008; asc     ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 19 page no 4 n bits 72 index `c1` of table `yzs`.`t2` trx id 8975 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 80000005; asc     ;;
 1: len 4; hex 8000001e; asc     ;;

*** WE ROLL BACK TRANSACTION (1)

4、사쇄일지 분석
TRANSACTION 8975:
delete from t2 where id=30을 실행한 후, 보유한 자물쇠는 색인 레코드(30,5,8)를 모은 X 유형의 레코드 자물쇠lockmode X locks rec but not gap, 대기 요청 자물쇠는 2단계 색인 레코드(5,30)의 X 유형 레코드 자물쇠lockmode X locks rec but not gap waiting.
TRANSACTION 8976:
업데이트 t2 set c2=8 where c1=5 문장을 실행하면 요청 대기 자물쇠가 색인 레코드(30,5,8)를 모은 X 형식의 레코드 자물쇠lockmode X locks rec but not gap waiting.
사라진 자물쇠 일지에서만 사라진 자물쇠의 원인을 알 수 없다.커밋되지 않은 트랜잭션 중 실행되었지만 커밋되지 않은 SQL 문 자물쇠로 인해 소유한 자물쇠가 표시되지 않습니다.
5. 잠금 원리
업데이트 잠금 원리는 이전 블로그를 보십시오:
    https://blog.csdn.net/yanzongshuai/article/details/80872095
    https://blog.csdn.net/yanzongshuai/article/details/80870957
    https://blog.csdn.net/yanzongshuai/article/details/80870949
delete 잠금 원리는 이전 블로그를 보십시오:
    https://blog.csdn.net/yanzongshuai/article/details/79243727
    https://blog.csdn.net/yanzongshuai/article/details/79222041
6. 해석
session1 select*from t2 where id=30 for update 실행;후 메인 키 30을 검색하면 (30,5,8)에 X 형식의 기록 자물쇠를 추가합니다
session2 업데이트 t2 set c2=8 where c1=5 실행;이후 검색 단계에서 2단계 인덱스를 검색하여 (5,30)까지 검색하고 이 기록에 X 형식의next-key 자물쇠lockmode X;그리고 집합 색인 기록 30을 검색하려면 집합 색인 기록(30,5,8)에 X 형식 기록 자물쇠를 추가해야 합니다.session1과 서로 밀접하기 때문에 자물쇠가 기다립니다.
session1 delete from t2 where id=30;기록 자물쇠 집합 색인 기록(30,5,8)에 대해 X 유형의 기록 자물쇠를 신청하면 사무 앞에서 이미 신청했기 때문에 더 이상 신청하지 않습니다.두 번째 색인 기록(5,30)에 X 형식의 기록 자물쇠를 추가하고session2와 서로 밀어냅니다.
이렇게 서로 자물쇠가 생겨 기다리다가 사라진다.
7. 해결 방법
양기용 형은 세션 2의 업데이트 t2 set c2=8 where c1=5를 메인 키로 변경하여 업데이트 tx set c2=x where id=30을 업데이트할 것을 제안했다.이렇게 자물쇠를 채우는 순서는 모두 먼저 모인 다음에 2급 인덱스입니다. 메인 키와 2급 인덱스의 자물쇠를 채우는 순서가 교차하여 자물쇠가 사라지는 것을 피합니다.

좋은 웹페이지 즐겨찾기