1. 잠금(동시성 제어)이 필요한 이유는 무엇입니까?
다중 사용자 환경에서는 여러 사용자가 동시에 동일한 기록을 업데이트할 수 있으며 이로 인해 충돌이 발생할 수 있습니다. 이것이 유명한 동시성 문제이다.
일반적인 충돌은 다음과 같습니다.
1. 업데이트 손실: 한 트랜잭션의 업데이트가 다른 트랜잭션의 업데이트 결과를 덮어쓰는데, 이를 업데이트 손실이라고 합니다. 예를 들어, 사용자 A는 값을 6에서 2로 변경하고, 사용자 B는 값을 2에서 6으로 변경한 후 사용자 A의 업데이트가 손실됩니다.
2. 더티 읽기: 더티 읽기는 트랜잭션이 절반 완료된 다른 트랜잭션의 레코드를 읽을 때 발생합니다. 예를 들어, 사용자 A와 B가 본 값은 모두 6이고, 사용자 B는 값을 2로 변경했는데, 사용자 A가 읽은 값은 여전히 6입니다.
동시성으로 인해 발생하는 이러한 문제를 해결하기 위해. 동시성 제어 메커니즘을 도입해야 합니다.
2. 동시성 제어 메커니즘
잠금, 즉 우리가 선택한 대상 데이터를 다른 프로그램에서 수정할 수 없도록 잠급니다. ㅋㅋ 외부에서 수정되는 데이터(시스템의 다른 현재 트랜잭션 및 외부 시스템의 트랜잭션 처리 포함)에 대해 보수적인 태도를 의미하므로 전체 데이터 처리 과정에서 데이터가 잠금 상태로 유지됩니다. 2 낙관적 잠금: 동시성 충돌이 발생하지 않는다고 가정하고 작업을 제출할 때 데이터 무결성이 위반되었는지 여부만 확인합니다. 낙관적 잠금은 더티 읽기 문제를 해결할 수 없습니다.
3. 낙관적 잠금 구현
데이터 버전(Version) 기록 메커니즘을 사용하여 구현됩니다. 이는 낙관적 잠금의 구현 방법 중 가장 일반적으로 사용됩니다. 데이터 버전이란 무엇입니까? 이는 일반적으로 데이터베이스 테이블에 숫자 "버전" 필드를 추가하여 데이터에 버전 식별자를 추가하는 것입니다. 데이터를 읽을 때 버전 필드의 값을 함께 읽어 데이터가 업데이트될 때마다 버전 값이 1씩 증가합니다. 업데이트를 제출할 때 데이터베이스 테이블에 있는 해당 레코드의 현재 버전 정보를 처음 가져온 버전 값과 비교합니다. 그렇지 않으면 만료된 데이터로 간주됩니다
1. 데이터베이스 테이블 디자인
Yii2.0 낙관적 잠금 및 비관적 잠금 예 자세한 설명
redis에서 트랜잭션 메커니즘 및 낙관적 잠금을 구현하는 방법
위 내용은 PHP 낙관적 잠금 원리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!