2017-03-31 9 views
0

innodDB는 일관된 비 차단 읽기, 의 메커니즘을 사용하므로 모든 트랜잭션이 자체 스냅 샷과 함께 작동합니다.MySql InnoDB 반복 가능 읽기 잠금의 예기치 않은 동작

그것은 또한 말했다되는 공식 documentation

테이블이 액세스, 따라서 다른 세션 일관된 읽기가 동시에 해당 테이블을 자유롭게 변경할 수 있습니다에 락 (lock)을 설정하지 않는 일관된 읽기 테이블에서 수행됩니다.

그러나 고전 '읽기/업데이트'교착 상태가 나타날 때 예기치 않게 행동에 직면 :

격리 수준은 REPEATABLE READ

(도를 저지른 READ로 재현)
  1. 거래 1 행 (NOT공유 모드에서 잠금).

  2. 트랜잭션이은 동일한 행을 읽고 (또한 하지주 모드에서 잠금). 다음

  3. 트랜잭션 1이 행을 업데이트하려고합니다.

  4. 트랜잭션 2도이 행을 업데이트하려고합니다. ---------------- 2017년 3월 31일 16시 7분 : 최종 공정 후에

는 이노 교착 (아래 최신 DETECTED 교착 존재)을 검출한다 : 03 0x1f58 *** (1) 거래 : 트랜잭션 413412, 활성 20 초 시작 인덱스 읽기 사용중인 mysql 테이블 1, 잠김 1 잠금 대기 9 잠금 구조체, 힙 크기 1136, 6 행 잠금 (들) , 로그 엔트리 실행 취소 3 MySQL 스레드 ID 33, OS 스레드 핸들 8148, 쿼리 ID 102005 로컬 호스트 127.0.0.1 루트 업데이트

/* update Order */ update `Order` set ... <fields to update> 

*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413412 lock_mode X locks rec but not gap waiting 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** (2) TRANSACTION: 
TRANSACTION 413413, ACTIVE 11 sec starting index read 
mysql tables in use 1, locked 1 
9 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 3 
MySQL thread id 28, OS thread handle 8024, query id 102008 localhost 127.0.0.1 root updating 

/* update Order */ update `Order` set ...<fields to update> 

*** (2) **HOLDS THE LOCK(S):** 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413413 lock mode S locks rec but not gap 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413413 lock_mode X locks rec but not gap waiting 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** WE ROLL BACK TRANSACTION (2) 
트랜잭션이

잠금 (S) 그래서 InnoDB하지만 그럼에도 불구하고 스냅 샷 세트 S 잠금 이 함께 않습니다 일관된 읽기를 사용하지 않을 경우

을 보유하고 왜

나는 어떤 일이 발생, 이해할 수없는 공식 설명서에 기록 된 사실과 일치하지 않습니다.

답변

1

하지 마십시오. 행을 업데이트하면서 값을 필요로하는 경우 SELECT ... FOR UPDATE;을 사용하십시오. 그냥 그렇게하고 tx_isolation을 잊어 버리십시오. 일반적으로 교착 상태가 지연됩니다.자세한 내용은 innodb_lock_wait_timeout을 참조하십시오. 기본값은 지나치게 긴 50 초입니다.

데드락이 발생하면 전체 트랜잭션을 다시 실행하십시오. 교착 상태는 당신이 그들을 피하려고 얼마나 열심히 할지라도 일어날 것이다.