MySQL 데이터베이스에서 필드 증분 중 경합 조건 완화
동시 업데이트를 위해 여러 연결이 동일한 MySQL 데이터베이스 레코드에 액세스하는 시나리오에서 경쟁 조건이 발생하여 의도하지 않은 부정확한 업데이트가 발생할 수 있습니다. 이는 두 연결이 모두 동일한 필드 값(예: 카운터)을 검색하여 이를 증가시키고 각각의 증가된 값으로 레코드를 업데이트할 때 발생할 수 있습니다. 두 연결 모두 독립적으로 작동하므로 최종 업데이트된 값은 의도된 다중 증분 대신 단일 증분만 반영할 수 있습니다.
이 문제를 해결하기 위해 MySQL은 다양한 접근 방식을 제공합니다.
원자적 업데이트
원자 업데이트를 활용하면 필드 증분이 즉각적이고 원자적으로 발생하도록 할 수 있습니다. 이는 아래와 같이 필드를 증가시키는 단일 쿼리를 통해 달성할 수 있습니다.
update table set tries=tries+1 where condition=value;
행 잠금
행 잠금은 또 다른 실행 가능한 솔루션입니다. 이 기술을 사용하면 연결에서 업데이트 중인 행을 잠글 수 있습니다. 이렇게 하면 한 번에 하나의 연결만 행을 수정할 수 있으므로 경쟁 조건이 제거됩니다. 행 잠금과 함께 지원을 위해 MyISAM 테이블보다는 InnoDB 테이블을 사용하는 것이 좋습니다. 행 잠금을 사용하는 샘플 쿼리는 다음과 같습니다.
select tries from table where condition=value for update; .. do application logic to add to `tries` update table set tries=newvalue where condition=value;
버전 체계
널리 사용되는 접근 방식은 데이터베이스 테이블에 버전 열을 도입하는 것입니다. 이 버전 열은 기록의 변경 사항을 추적하고 경합 상태를 감지하는 데 도움을 줍니다. 이 접근 방식을 사용하는 쿼리는 일반적으로 다음 패턴을 따릅니다.
select tries,version from table where condition=value; .. do application logic, and remember the old version value. update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;
업데이트가 실패하거나 영향을 받은 행이 0개 반환되는 경우 이는 다른 연결이 테이블을 동시에 업데이트했음을 의미합니다. 이러한 경우 업데이트된 값 검색, 애플리케이션 로직 수행, 업데이트 다시 시도 등 프로세스를 다시 시작해야 합니다.
위 내용은 MySQL 데이터베이스에서 필드 증분 중 경쟁 조건을 어떻게 완화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!