낙관적 잠금을 구현하는 두 가지 일반적인 방법이 있습니다. 즉, 1. 버전 번호 메커니즘 2. CAS 알고리즘. 그 중에서 버전 번호 메커니즘을 통해 낙관적 잠금을 구현하는 것이 가장 고전적인 방법입니다. 버전 번호 메커니즘은 일반적으로 데이터베이스 버전 번호 버전 필드를 데이터 테이블에 추가합니다.
구현 방법:
(권장 학습: mysql tutorial)
1. 버전 번호 메커니즘
은 일반적으로 데이터 테이블에 데이터베이스 버전 번호 버전 필드를 추가하여 데이터 번호를 표현하는 것을 의미합니다. 수정 데이터가 수정되면 버전 값이 1 증가합니다.
예:
물론 스레드 A가 데이터 값을 업데이트해야 하는 경우 업데이트를 제출할 때 방금 읽은 버전 값이 파일의 버전 값과 같으면 데이터를 읽는 동안 버전 값도 읽습니다. 현재 데이터베이스 업데이트만 수행합니다. 그렇지 않으면 업데이트가 성공할 때까지 업데이트 작업을 다시 시도합니다.
2. CAS 알고리즘
CAS(비교 및 교환)는 3개의 피연산자, 메모리 주소 V, 예상 값 B 및 대체할 대상 하위 A가 있습니다.
CAS 명령이 실행되면 메모리 주소 V와 예상 값 B가 동일한지 비교합니다. 동일하면 A가 B에 할당됩니다. (동일하지 않으면 비교가 동일할 때까지 반복됩니다. 같음.) 전체 비교 할당 작업은 원자적 작업입니다.
CAS 단점:
(1) 큰 사이클 시간 오버헤드: 메모리 주소 V가 예상 값 B와 같지 않으면 동일할 때까지 계속 루프하고 비교합니다.
(2)
(3) 변수 V를 처음 읽을 때 A의 값을 갖고 할당을 준비할 때 여전히 A의 값인 것으로 확인되면 그 값을 설명할 수 있습니까? 다른 스레드에 의해 수정되지 않았습니까? 분명히 그렇지 않습니다. 이 기간 동안 해당 값이 다른 값으로 변경되었다가 다시 A로 변경될 수 있기 때문입니다. 그러면 CAS 연산은 변경된 적이 없다고 생각할 것입니다. 이 문제를 CAS 연산의 "ABA"라고 합니다. 질문;
위 내용은 낙관적 잠금을 구현하는 몇 가지 일반적인 방법이 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!