>  기사  >  백엔드 개발  >  PHP 낙관적 잠금 원리에 대한 자세한 설명

PHP 낙관적 잠금 원리에 대한 자세한 설명

小云云
小云云원래의
2018-03-08 09:21:542854검색

1. 잠금(동시성 제어)이 필요한 이유는 무엇입니까?

다중 사용자 환경에서는 여러 사용자가 동시에 동일한 기록을 업데이트할 수 있으며 이로 인해 충돌이 발생할 수 있습니다. 이것이 유명한 동시성 문제이다.
일반적인 충돌은 다음과 같습니다.
1. 업데이트 손실: 한 트랜잭션의 업데이트가 다른 트랜잭션의 업데이트 결과를 덮어쓰는데, 이를 업데이트 손실이라고 합니다. 예를 들어, 사용자 A는 값을 6에서 2로 변경하고, 사용자 B는 값을 2에서 6으로 변경한 후 사용자 A의 업데이트가 손실됩니다.
2. 더티 읽기: 더티 읽기는 트랜잭션이 절반 완료된 다른 트랜잭션의 레코드를 읽을 때 발생합니다. 예를 들어, 사용자 A와 B가 본 값은 모두 6이고, 사용자 B는 값을 2로 변경했는데, 사용자 A가 읽은 값은 여전히 ​​6입니다.

동시성으로 인해 발생하는 이러한 문제를 해결하기 위해. 동시성 제어 메커니즘을 도입해야 합니다.

2. 동시성 제어 메커니즘

잠금, 즉 우리가 선택한 대상 데이터를 다른 프로그램에서 수정할 수 없도록 잠급니다. ㅋㅋ                                                           외부에서 수정되는 데이터(시스템의 다른 현재 트랜잭션 및 외부 시스템의 트랜잭션 처리 포함)에 대해 보수적인 태도를 의미하므로 전체 데이터 처리 과정에서 데이터가 잠금 상태로 유지됩니다.          2 낙관적 잠금: 동시성 충돌이 발생하지 않는다고 가정하고 작업을 제출할 때 데이터 무결성이 위반되었는지 여부만 확인합니다. 낙관적 잠금은 더티 읽기 문제를 해결할 수 없습니다.

3. 낙관적 잠금 구현
데이터 버전(Version) 기록 메커니즘을 사용하여 구현됩니다. 이는 낙관적 잠금의 구현 방법 중 가장 일반적으로 사용됩니다. 데이터 버전이란 무엇입니까? 이는 일반적으로 데이터베이스 테이블에 숫자 "버전" 필드를 추가하여 데이터에 버전 식별자를 추가하는 것입니다. 데이터를 읽을 때 버전 필드의 값을 함께 읽어 데이터가 업데이트될 때마다 버전 값이 1씩 증가합니다. 업데이트를 제출할 때 데이터베이스 테이블에 있는 해당 레코드의 현재 버전 정보를 처음 가져온 버전 값과 비교합니다. 그렇지 않으면 만료된 데이터로 간주됩니다

1. 데이터베이스 테이블 디자인

작업

에는 id, value, version

이라는 세 가지 필드가 있습니다. 2. 구현

1) 읽기 먼저 작업 테이블의 데이터(실제로 이 테이블 레코드에는 필드가 하나만 있음), 버전 값은 versionValue

2) 작업 테이블의 값 필드를 업데이트할 때마다 충돌을 방지하기 위해 다음이 필요합니다.

업데이트 작업 설정 값 = newValue, 버전 = versionValue + 1 여기서 버전 = versionValue ;

이 명령문이 실행될 때만 값 필드 값의 업데이트가 성공했음을 나타냅니다.

두 개의 노드가 있다고 가정합니다. A와 B는 거의 동시에 작업 테이블의 값 필드 값을 업데이트합니다. 노드 A와 노드 B가 작업 테이블에서 읽은 버전 값은 2이고, 노드 A와 노드 B가 값 필드 값을 업데이트합니다. , 둘 다 업데이트 작업 설정 값 = newValue, 버전 = 3(여기서 버전 = 2)을 수행합니다. 실제로는 1개의 노드만 SQL 문을 성공적으로 실행한다고 가정합니다. 노드 A가 성공적으로 실행되면 작업 테이블의 버전 필드 값이 표시됩니다. 그런 다음 노드 B는 업데이트 작업 세트 값 = newValue, 버전 = 3, 여기서 버전 = 2를 수행합니다. 이 SQL 문은 실행되지 않으므로 작업 테이블을 업데이트할 때 충돌이 발생하지 않습니다.

관련 권장 사항:

Yii2.0 낙관적 잠금 및 비관적 잠금 예 자세한 설명

redis에서 트랜잭션 메커니즘 및 낙관적 잠금을 구현하는 방법

데이터베이스에 대한 낙관적 잠금 및 비관적 잠금

위 내용은 PHP 낙관적 잠금 원리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.