문제가 발생하는 환경:
1. 동일한 트랜잭션 내에서 동일한 데이터를 연속적으로 삽입하고 업데이트합니다.
3. 높은 동시성이 즉시 발생합니다. 예외가 발생했습니다. 예외 정보:
org.springframework.dao.CannotAcquireLockException:
### 데이터베이스 업데이트 오류 원인: java.sql.SQLException: 트랜잭션 재시작 시도### 오류가 발생할 수 있습니다. com.*.dao.mapper.PhoneFlowMapper.updateByPrimaryKeySelective-Inline동시성이 높은 경우 Spring 트랜잭션으로 인해 데이터베이스 교착 상태가 발생하고 후속 작업이 시간 초과되어 예외가 발생합니다.### 매개변수 설정 중 오류가 발생했습니다
### SQL:------다음은 SQL 문 및 스택 정보입니다------ -
원인 분석
Solution
select * from information_schema.innodb_trx
innodb_lock_wait_timeout=500
SHOW INNODB STATUS/G를 사용하여 잠금 상태를 확인할 수 있습니다.
3. 솔루션을 검색하고 관리 노드의 [ndbd 기본값] 영역에
TransactionDeadLockDetectionTimeOut=10000(10초로 설정)을 추가합니다. 기본값은 1200(1.2초)입니다.
4. 교착 상태를 감지하고 대응하거나 교착 상태를 종료합니다.
InnoDB는 자동으로 트랜잭션 교착 상태를 감지하고 트랜잭션을 롤백하여 교착 상태를 해제합니다. InnoDB는 롤백할 작은 트랜잭션을 선택하려고 시도하며 트랜잭션 크기는 삽입, 업데이트 또는 삭제된 행 수에 따라 결정됩니다.
매개변수 innodb_table_locks=1 및 autocommit=0인 경우 InnoDB는 MySQL 수준에서 테이블 교착 상태 및 행 수준 잠금에 주의를 기울입니다. 또한 InnoDB는 MySQL Lock Tables 명령 및 기타 스토리지 엔진 교착 상태를 감지하지 않습니다. 이 상황을 해결하려면 innodb_lock_wait_timeout을 설정해야 합니다.
innodb_lock_wait_timeout은 Innodb가 행 수준 잠금을 포기하는 시간 초과입니다.
위 내용은 MySQL 트랜잭션 잠금 대기 시간 초과 잠금 대기 시간 초과 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!