> 데이터 베이스 > MySQL 튜토리얼 > MySQL 데이터베이스에서 필드 증분 중 경쟁 조건을 어떻게 완화할 수 있습니까?

MySQL 데이터베이스에서 필드 증분 중 경쟁 조건을 어떻게 완화할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-11-13 13:07:02
원래의
292명이 탐색했습니다.

How Can You Mitigate Race Conditions During Field Incrementation in MySQL Databases?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿