MySQL을 일괄적으로 추가하거나 수정할 때 예외 발생: 잠금 대기 시간 초과, 트랜잭션 재시작 시도

제목: MySQL을 배치로 추가하거나 수정할 때 "중첩된 예외는 java.sql.SQLException: 잠금 대기 시간 초과됨, 트랜잭션 다시 시작 시도" 예외 해결

요약

배치 추가 또는 수정 작업에 MySQL 데이터베이스를 사용할 때 때때로 "중첩 예외는 java.sql.SQLException: 잠금 대기 시간 초과 초과, 트랜잭션 다시 시작 시도" 예외가 발생합니다. 이 문서에서는 예외가 발생하는 이유를 설명하고 이를 해결하는 방법을 제공합니다.
MySQL 데이터베이스를 사용하여 애플리케이션을 개발할 때 작업을 배치로 추가하거나 수정할 때 "중첩 예외는 java.sql.SQLException: 잠금 대기 시간 초과, 트랜잭션 다시 시작 시도" 예외가 발생할 수 있습니다. 이 예외는 일반적으로 잠금 대기 시간이 초과되어 트랜잭션이 완료되지 않음을 의미합니다.

이상

"중첩된 예외는 java.sql.SQLException입니다. 잠금 대기 제한 시간이 초과되었습니다. 트랜잭션을 다시 시작하십시오." 예외에 대한 이유는 다음과 같을 수 있습니다.

  1. 동시 액세스 위반: 여러 트랜잭션이 동시에 동일한 데이터 행에 액세스하고 트랜잭션 중 하나가 데이터 행을 수정하는 경우 수정이 완료될 때까지 다른 트랜잭션이 차단될 수 있습니다. 대기 시간이 MySQL 잠금 대기 제한 시간 설정을 초과하는 경우 이 예외가 발생합니다.

  2. 잠금 대기 시간 초과 설정이 불합리합니다. MySQL에는 트랜잭션이 잠금을 기다리는 시간을 제어하는 ​​데 사용되는 잠금 대기 시간 초과 설정이 있습니다. 설정된 시간이 너무 짧으면 트랜잭션이 지정된 시간 내에 필요한 잠금을 얻지 못하여 예외가 발생할 수 있습니다.

  3. 데이터베이스 성능 문제: 많은 수의 동시 작업 또는 너무 복잡한 쿼리와 같이 데이터베이스 성능에 문제가 있는 경우 잠금 대기 시간이 초과될 수 있습니다.

해결책

위 예외의 원인에 따라 가능한 솔루션은 다음과 같습니다.

  1. 잠금 대기 시간 초과 조정: 트랜잭션이 잠금을 기다리는 시간이 더 길어지도록 MySQL 잠금 대기 시간 초과를 늘릴 수 있습니다. MySQL 구성 파일(예: my.cnf)에서 innodb_lock_wait_timeout 매개변수를 수정하여 잠금 대기 시간 제한을 조정할 수 있습니다. 이 값을 늘리면 예외가 발생할 가능성이 줄어들 수 있습니다.

  2. 데이터베이스 성능 최적화: 데이터베이스 성능을 최적화하여 동시 작업 또는 쿼리의 복잡성을 줄입니다. 인덱스를 사용하여 쿼리 속도를 높이고, 느린 쿼리 문을 최적화하고, 데이터베이스 서버의 하드웨어 리소스를 늘릴 수 있습니다.

  3. 일괄 처리 데이터: 일괄 작업의 데이터 양이 많은 경우 처리를 위해 데이터를 여러 개의 작은 일괄 처리로 나눌 수 있습니다. 각 배치의 데이터 양이 적기 때문에 잠금 대기 시간을 줄이고 비정상 발생 가능성을 줄일 수 있습니다.

  4. 낙관적 잠금 또는 비관적 잠금 사용: 낙관적 잠금 또는 비관적 잠금을 사용하여 동시 액세스 충돌을 처리할 수 있습니다. 낙관적 잠금은 업데이트 작업 중에 데이터의 버전 번호 또는 타임스탬프를 확인하여 충돌을 피하는 반면, 비관적 잠금은 명시적으로 트랜잭션을 잠그어 충돌을 피합니다. 애플리케이션 요구 사항에 맞는 잠금 메커니즘을 선택하면 잠금 대기 시간 초과 가능성을 줄일 수 있습니다.

샘플 코드

다음은 낙관적 잠금을 사용하는 샘플 코드입니다.

// 假设dataList为包含要批量修改的数据的List对象
for (Data data : dataList) {
    
    
    // 查询数据库中的原始数据
    Data originalData = yourRepository.findById(data.getId());

    // 进行数据的修改操作
    originalData.setName(data.getName());
    originalData.setValue(data.getValue());

    // 使用乐观锁机制更新数据
    int rowsAffected = yourRepository.updateWithOptimisticLock(originalData);
    
    // 检查是否成功更新数据
    if (rowsAffected == 0) {
    
    
        // 处理更新失败的情况
    }
}

실제 상황에 따라 위의 코드를 수정하고 필요에 따라 적절한 잠금 메커니즘을 선택하십시오.

결론적으로

배치 추가 또는 수정 작업에 MySQL 데이터베이스를 사용하는 경우 "중첩 예외는 java.sql.SQLException: 잠금 대기 시간 초과 초과, 트랜잭션 재시작 시도" 예외는 동시 액세스 충돌, 비합리적인 잠금 대기 시간 초과 설정 또는 데이터베이스 성능 문제로 인해 발생할 수 있습니다. 잠금 대기 제한 시간을 조정하거나, 데이터베이스 성능을 최적화하거나, 데이터를 배치로 처리하거나, 적절한 잠금 메커니즘을 사용하면 이 예외를 해결하고 배치 작업을 원활하게 완료할 수 있습니다.

Acho que você gosta

Origin blog.csdn.net/weixin_45626288/article/details/131462656
Recomendado
Clasificación