>데이터 베이스 >MySQL 튜토리얼 >MySQL 트랜잭션 잠금 대기 시간 초과 잠금 대기 시간 초과 수행할 작업

MySQL 트랜잭션 잠금 대기 시간 초과 잠금 대기 시간 초과 수행할 작업

PHPz
PHPz앞으로
2023-06-03 11:32:473049검색

문제 시나리오

문제가 발생하는 환경:
1. 동일한 트랜잭션 내에서 동일한 데이터를 연속적으로 삽입하고 업데이트합니다.
3. 높은 동시성이 즉시 발생합니다. 예외가 발생했습니다. 예외 정보:

org.springframework.dao.CannotAcquireLockException:

### 데이터베이스 업데이트 오류 원인: java.sql.SQLException: 트랜잭션 재시작 시도
### 오류가 발생할 수 있습니다. com.*.dao.mapper.PhoneFlowMapper.updateByPrimaryKeySelective-Inline

### 매개변수 설정 중 오류가 발생했습니다
### SQL:------다음은 SQL 문 및 스택 정보입니다------ -


원인 분석

동시성이 높은 경우 Spring 트랜잭션으로 인해 데이터베이스 교착 상태가 발생하고 후속 작업이 시간 초과되어 예외가 발생합니다.

Mysql 데이터베이스는 InnoDB 모드를 채택합니다. innodb_lock_wait_timeout은 잠금 대기 시간을 50초로 설정합니다. 데이터베이스 잠금이 이 시간을 초과하면 오류가 보고됩니다.

Solution

1. 다음 명령문을 사용하여 제출된 거래에 대한 데이터를 찾고 이 스레드를 종료합니다.

select * from information_schema.innodb_trx

2. 잠금 대기 시간을 늘립니다. 즉, 다음 구성 항목의 매개변수 값을 초 단위로 늘립니다.

innodb_lock_wait_timeout=500

3. 저장 프로세스를 최적화하고 트랜잭션을 오래 기다리지 않도록 합니다.

참고사항

1. 잠금 대기 시간이 초과되었습니다. 이는 다른 트랜잭션이 잠금 리소스를 해제하기를 기다리는 현재 트랜잭션으로 인해 발생합니다. 잠금 리소스를 놓고 경쟁하는 테이블과 명령문을 찾고, SQL을 최적화하고, 인덱스를 생성하는 등의 작업을 수행할 수 있습니다. 그래도 문제가 해결되지 않으면 동시 스레드 수를 적절하게 줄일 수 있습니다.

2. 특정 테이블을 잠그는 동안 트랜잭션 시간이 초과되었습니다. 테이블이 다른 프로세스에 의해 잠겨 있고 해제되지 않은 것으로 추정됩니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제