MySQL 잠금 메커니즘은 테이블 수준 잠금과 행 수준 잠금으로 구분됩니다. 이 기사에서는 MySQL의 행 수준 잠금에서 공유 잠금과 배타적 잠금의 공유 및 교환을 공유합니다.
공유 잠금은 읽기 잠금 또는 줄여서 S 잠금이라고도 합니다. 이름에서 알 수 있듯이 공유 잠금은 여러 트랜잭션이 동일한 데이터에 대한 잠금을 공유할 수 있고 모두 데이터에 액세스할 수 있지만 읽기 및 읽기만 가능함을 의미합니다. 수정할 수 없습니다.
배타적 잠금은 쓰기 잠금이라고도 하며 공유 잠금, 배타적 잠금이라고도 하는데 배타적 잠금을 획득한 트랜잭션은 데이터를 읽고 수정할 수 있습니다.
모두가 공유 잠금에 대해 잘 알고 있을 수 있습니다. 즉, 다중 트랜잭션은 데이터를 읽을 수만 있고 데이터를 수정할 수는 없습니다. 그러나 배타적 잠금에 대해서는 사람마다 서로 다른 이해가 있을 수 있습니다. 배타적 잠금은 데이터 행을 잠그고, 다른 트랜잭션은 데이터 행을 읽고 수정할 수 없습니다. 배타적 잠금은 트랜잭션이 데이터 행에 배타적 잠금을 추가한 후 다른 트랜잭션이 해당 데이터 행에 다른 잠금을 추가할 수 없음을 의미합니다. mysql InnoDB 엔진의 기본 수정 데이터 문인 update, delete 및 insert는 관련 데이터에 자동으로 배타적 잠금을 추가합니다. select 문은 기본적으로 배타적 잠금을 추가하는 경우 어떤 잠금 유형도 추가하지 않습니다. select...for update 문을 추가하려면 공유 모드 문에서 select ... lock을 사용할 수 있습니다. 따라서 배타적 잠금이 설정된 데이터 행은 다른 트랜잭션에서 수정할 수 없으며 공유 모드 잠금에서는 업데이트 및 잠금을 통해 데이터를 쿼리할 수 없지만 select...from...을 통해 데이터를 직접 쿼리할 수 있습니다. 쿼리에는 잠금 메커니즘이 없습니다.
말하자면 다음과 같은 간단한 예를 살펴보겠습니다.
다음 테스트 데이터가 있습니다
이제 id=1인 데이터 행에 대해 단독 쿼리를 수행합니다. 트랜잭션을 열려면 start를 사용하세요. 트랜잭션을 커밋하거나 트랜잭션을 롤백하면 잠금이 해제되므로 이는 테스트용입니다.
쿼리 창 열기
이제 다른 쿼리 창을 열고 단독 쿼리와 공유 잠금 쿼리를 사용하여 동일한 데이터를 쿼리할 수 있습니다.
독점 쿼리
공유 쿼리
id=1인 데이터가 배타적 잠금으로 잠겨 있고 여기서 차단은 배타적 잠금이 해제되기를 기다리고 있기 때문에 배타적 잠금 및 공유 잠금 쿼리가 있는 쿼리가 차단된 상태에 있음을 알 수 있습니다.
다음 쿼리를 직접 사용하면 어떨까요
데이터를 쿼리할 수 있음을 알 수 있습니다.
공유 잠금을 획득하는 트랜잭션을 다시 살펴보겠습니다. 다른 쿼리에서는 공유 잠금만 추가할 수 있는지 여부만 알 수 있습니다.
데이터를 쿼리할 수는 있지만, 동일한 데이터에는 배타적 잠금과 공유 잠금이 존재할 수 없기 때문에 배타적 잠금을 추가하여 찾을 수 없음을 알 수 있습니다.
마지막으로 위에서 언급한 mysql InnoDb 엔진의 update, delete, insert 문에 자동으로 배타적 잠금이 추가되는 문제를 확인해 보자.
이때, 공유 쿼리는 차단되어 배타적 잠금을 기다린다. 잠금 메커니즘을 사용하지 않고 배타적 잠금과 상호 배타적이지 않기 때문에 데이터를 찾았지만 발견된 데이터는 데이터가 수정되기 전의 오래된 데이터입니다.
그런 다음 데이터를 제출하고 배타적 잠금을 해제하고 수정된 데이터를 살펴봅니다. 이때 행 데이터는 배타적 잠금을 해제하므로 배타적 쿼리, 공유 쿼리를 사용할 수 있습니다. 거래가 제출되면 아래에는 일반 쿼리만 표시됩니다. 다른 학생들이 직접 확인합니다.
결과가 예상대로 나온 것을 볼 수 있습니다.
추천 튜토리얼: "Mysql Tutorial"
위 내용은 mysql의 공유 잠금과 배타적 잠금에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!