0
두 개의 업데이트 쿼리로 인해 교착 상태가 발생하는 경우를 연구합니다. 나는 이해할 수 없다. 1. 행 잠금 설정 순서? 2. 업데이트가 실행될 때 1 차 및 2 차 인덱스에서 잠금 설정 순서? 3. SHOW INNODB STATUS는 x lock struct를 기다리는 것을 보여줍니다. 동시에 필요합니까? 아니면 다른 것이 부여 된 후에 하나가 필요합니까? 4. 하나의 잠금 구조체가 일부 행을 잠 그려면 프로세스가 어 떻지 않은가? DB에서 ExampleRowsInnodb 기본 키 및 보조 인덱스에서 잠금 주문
012,351update study_update_deadlock set quantity=quantity+1 where u_key=1470344318505049187 and nu_key=12498159
일부 행 : 쿼리 1
CREATE TABLE `study_update_deadlock` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`u_key` bigint(20) DEFAULT NULL,
`nu_key` bigint(20) DEFAULT NULL,
`version` int(11) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `nu_key` (`nu_key`),
KEY `u_key` (`u_key`)
) ENGINE=InnoDB AUTO_INCREMENT=5000001 DEFAULT CHARSET=latin1 COMMENT='根据非唯一主键更新是发生死锁'
업데이트 :
update study_update_deadlock set version=version+1 where u_key=1663577608119220637 and nu_key=12498159
업데이트 쿼리 2 테이블 : 여기
내 교착 상태입니다 시나리오의 6,키 :
- 업데이트가 nu_key 지수
- 이 쿼리 업데이트 다른 행하지만 두 행을 따르면 같은 nu_key 지수를
- TRX1의 LOCK WAIT 5 잠금 구조체 (들)을 가지고? 모두 잠금 요구 그래프를 잠그기 위해 추가되었습니다.
- TRX2 HOLDS PrimaryKey 및 nu_key 인덱스에서 대기 잠금. 하지만 인덱스 잠금을 먼저 알고있는 것에 따라 자물쇠는 원자가 아닌가?
- 격리 수준 : RR
교착 쇼 INNODB 상태
2016-06-29 18:58:32 700001f3b000
*** (1) TRANSACTION:
TRANSACTION 76027, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
LOCK WAIT 5 lock struct(s), heap size 1184, 8 row lock(s)
MySQL thread id 33311, OS thread handle 0x700001ab7000, query id 204129 localhost root updating
update study_update_deadlock set quantity = quantity+1 where u_key= 1470344318505049187 and nu_key=12498159
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 16 page no 22255 n bits 392 index `PRIMARY` of table `test`.`study_update_deadlock` trx id 76027 lock_mode X locks rec but not gap waiting
Record lock, heap no 255 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
0: len 4; hex 8036731e; asc 6s ;;
1: len 6; hex 0000000128fa; asc (;;
2: len 7; hex 770000179e081e; asc w ;;
3: len 8; hex 97163705443d799d; asc 7 D=y ;;
4: len 8; hex 8000000000beb4ef; asc ;;
5: len 4; hex 800000bb; asc ;;
6: len 4; hex 8000005a; asc Z;;
*** (2) TRANSACTION:
TRANSACTION 76028, ACTIVE 0 sec starting index read
mysql tables in use 3, locked 3
4 lock struct(s), heap size 1184, 3 row lock(s)
MySQL thread id 33312, OS thread handle 0x700001f3b000, query id 204130 localhost root updating
update study_update_deadlock set version = version+1 where u_key= 1663577608119220637 and nu_key=12498159
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 16 page no 22255 n bits 392 index `PRIMARY` of table `test`.`study_update_deadlock` trx id 76028 lock_mode X locks rec but not gap
Record lock, heap no 255 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
0: len 4; hex 8036731e; asc 6s ;;
1: len 6; hex 0000000128fa; asc (;;
2: len 7; hex 770000179e081e; asc w ;;
3: len 8; hex 97163705443d799d; asc 7 D=y ;;
4: len 8; hex 8000000000beb4ef; asc ;;
5: len 4; hex 800000bb; asc ;;
6: len 4; hex 8000005a; asc Z;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 16 page no 22336 n bits 952 index `nu_key` of table `test`.`study_update_deadlock` trx id 76028 lock_mode X waiting
Record lock, heap no 660 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 8; hex 8000000000beb4ef; asc ;;
1: len 4; hex 8036731c; asc 6s ;;
*** WE ROLL BACK TRANSACTION (2)
(이 질문에 대답하지 않습니다.)'INDEX (u_key, nu_key)'는 순서대로 문제를 해결해야합니다. –
@RickJames Thx! 다중 열 인덱스는 문제를 해결할 수 있지만 원하는 것은 잠금 설정에 대한 문서를 어디에서 찾을 수 있습니까? – BeanMr
'autocommit = OFF'로 실행하고 있습니까? 'BEGIN'을 가지고 있지만'COMMIT' (아직)이 없습니까? –