비관적 잠금, 이름에서 알 수 있듯이 매우 비관적입니다. 데이터를 얻으러 갈 때마다 다른 사람들이 수정할 것 같아서 데이터를 얻을 때마다 잠급니다. 이런 방식으로 다른 사람이 데이터를 얻으려고 하면 잠금을 얻을 때까지 차단됩니다. 이러한 많은 잠금 메커니즘은 행 잠금, 테이블 잠금, 읽기 잠금, 쓰기 잠금 등과 같은 기존 관계형 데이터베이스에서 사용되며 작업 전에 모두 잠깁니다.
가장 일반적으로 사용되는 것은 업데이트를 위한 선택입니다. 이는 선택 항목의 결과 행을 잠그고 제출하는 행 잠금입니다. 또는 다른 트랜잭션에서는 롤백하기 전에 이러한 행에 대해 업데이트, 삭제 또는 업데이트 작업을 수행할 수 없습니다.
Optimistic Lock, 이름에서 알 수 있듯이 매우 낙관적입니다. 데이터를 얻으러 갈 때마다 다른 사람들이 수정하지 않을 것이라고 생각합니다. 기간 이 데이터는 다른 사람이 마음대로 읽을 수 있지만 업데이트할 때 이 기간 동안 다른 사람이 데이터를 업데이트했는지 여부를 판단하고 버전 번호와 같은 메커니즘을 사용할 수 있습니다.
버전 번호 메커니즘은 낙관적 잠금에서 가장 일반적으로 사용되는 방법입니다. 업데이트하기 전에 버전 번호 필드를 테이블에 추가하여 버전 번호를 얻은 다음 다음과 같이 업데이트합니다. 업데이트 문의 조건은 버전 번호를 얻은 후 업데이트하기 전에 데이터가 변경되었으며 마지막으로 업데이트된 데이터가 0개이므로 업데이트가 실패하는 경우입니다. 업데이트가 실패했으며 동시성 문제가 발생했음을 의미합니다. 그런 다음 특정 처리를 수행합니다.
예를 들어 두 사람이 동시에 특정 데이터를 수정하는 경우 프로세스는 다음과 같습니다.
운영자 A는 다음과 같이 작동합니다.
select id, balance, version from table where id=“1”;# 🎜🎜#쿼리 결과: id =1, Balance=1000, version=1
update table set balance=balance+100, version=version+1 where id=“1” and version=1;실행 후 반환된 업데이트 결과는 1이며, 이는 데이터베이스의 결과가 하나임을 나타냅니다. : id=1, Balance=1100, version= 2Operator B는 다음과 같이 작동합니다:
select id, balance, version from table where id=“1”;쿼리 결과: id=1, Balance=1000, version=1, 이는 운영자 A가 아직 수정하지 않았음을 나타냅니다.
update table set balance=balance-50, version=version+1 where id=“1” and version=1 ;확인해보니 운영자 A가 아직 수정하지 않은 상태입니다. 업데이트 시점이 되면 운영자 A가 먼저 수정에 성공했으니 데이터베이스의 실제 값은 id=1, Balance 입니다. =1100, version=2 , 운영자 B도 버전 번호를 1씩 높이고(version=2) 데이터베이스에 데이터를 제출(balance=950)하려고 시도했지만 이때 id는 ="1" 및 version=1 데이터 을 찾을 수 없어 업데이트가 실패했으며, 실행 결과는 0으로, 성공적으로 업데이트된 데이터가 없음을 나타냅니다. 지금 다시 확인해 보세요. 결과는 여전히 연산자 A가 작업을 완료한 이후의 결과입니다id="1"인 테이블에서 id, 잔액, 버전을 선택하세요.#🎜 🎜 #
쿼리 결과: id=1, Balance=1100, version=2
위는 버전 번호 메커니즘을 직접 구현하는 원칙입니다. 사용되는 실제 버전 번호 메커니즘은 다음과 같습니다. 데이터베이스 자체에서 제공하는 메커니즘입니다. 업데이트된 버전 번호가 최신이 아닌 것으로 확인되면 거부됩니다.
위 내용은 비관적 잠금과 낙관적 잠금에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!