>  기사  >  데이터 베이스  >  MySQL에서 공유 잠금 및 배타적 잠금 사용 공유

MySQL에서 공유 잠금 및 배타적 잠금 사용 공유

零下一度
零下一度원래의
2017-04-21 15:56:393419검색


MySQL의 행 수준 잠금, 테이블 수준 잠금, 페이지 수준 잠금 중에서 행 수준 잠금이 MySQL에서 가장 세부적인 잠금이라고 소개했습니다. 데이터베이스 작업의 충돌을 줄입니다. 행 수준 잠금은 공유 잠금과 배타적 잠금으로 구분됩니다. 이 글에서는 공유 잠금과 배타적 잠금의 개념과 사용법, 주의사항을 자세히 소개합니다.

공유 잠금

읽기 잠금이라고도 하는 공유 잠금은 읽기 작업에 의해 생성되는 잠금입니다. 다른 사용자는 동시에 데이터를 읽을 수 있지만 모든 공유 잠금이 해제될 때까지 어떤 트랜잭션도 데이터를 수정할 수 없습니다(데이터에 대한 배타적 잠금 획득).

트랜잭션 T이 데이터A에 공유 잠금을 추가하는 경우 다른 트랜잭션은 A에 공유 잠금만 추가할 수 있고 배타적 잠금은 추가할 수 없습니다. 공유 잠금이 부여된 트랜잭션은 데이터를 읽을 수만 있고 데이터를 수정할 수는 없습니다.

사용

SELECT ... LOCK IN SHARE MODE;

쿼리 문 뒤에 LOCK IN SHARE MODE을 추가하면 MySQL은 쿼리 결과의 각 행에 공유를 추가합니다. 쿼리 결과 집합의 모든 행에 대해 배타적 잠금을 사용하는 다른 스레드가 없으면 공유 잠금을 성공적으로 적용할 수 있습니다. 그렇지 않으면 차단됩니다. 다른 스레드도 공유 잠금을 사용하여 테이블을 읽을 수 있으며 이러한 스레드는 동일한 버전의 데이터를 읽습니다.

배타적 잠금

배타적 잠금은 쓰기 잠금 및 배타적 잠금이라고도 합니다. 트랜잭션T이 데이터에 배타적 잠금을 추가A하면 다른 트랜잭션은 더 이상 액세스할 수 없습니다A. 모든 유형의 봉쇄를 추가하십시오. 배타적 잠금이 부여된 트랜잭션은 데이터를 읽고 수정할 수 있습니다.

사용 방법

SELECT ... FOR UPDATE;

쿼리 문 뒤에 FOR UPDATE을 추가하면 MySQL은 쿼리 결과의 각 행에 단독 추가를 추가합니다. 다른 스레드가 쿼리 결과 집합의 행에 대해 배타적 잠금을 사용하지 않으면 배타적 잠금을 성공적으로 적용할 수 있으며, 그렇지 않으면 차단됩니다.

의도 잠금

의도 잠금은 테이블 수준 잠금으로, 주로 트랜잭션의 다음 행에 대해 요청되는 잠금 유형을 표시하도록 설계되었습니다. InnoDB의 두 테이블 잠금:

  • 의도 공유 잠금(IS): 트랜잭션이 데이터 행에 공유 잠금을 추가할 준비를 하고 있음을 나타냅니다. 이는 데이터 행을 획득해야 함을 의미합니다. IS 테이블 잠금

  • 의도 배타적 잠금(IX): 위와 유사하며, 트랜잭션이 배타적 잠금 추가를 준비 중임을 나타냅니다. 테이블의 IX 잠금을 먼저 획득해야 하기 전에 트랜잭션이 데이터 행에 배타적 잠금을 추가하고 있음을 나타내는 데이터 행입니다.

의도 잠금은 InnoDB에 의해 자동으로 추가되며 사용자 개입이 필요하지 않습니다.

INSERT, UPDATEDELETE의 경우 InnoDB는 일반 SELECT 문에 대해 관련 데이터에 자동으로 배타적 잠금을 추가하며 InnoDB는 잠금을 추가하지 않으며 다음을 통해 트랜잭션을 수행할 수 있습니다. 다음 명령문은 공유 잠금 또는 배타적 잠금을 명시적으로 추가합니다.

공유 잠금: SELECT ... LOCK IN SHARE MODE;

전용 잠금: SELECT ... FOR UPDATE;

위 내용은 MySQL에서 공유 잠금 및 배타적 잠금 사용 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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