>  기사  >  데이터 베이스  >  MySQL 트랜잭션, 잠금 및 애플리케이션 (2)

MySQL 트랜잭션, 잠금 및 애플리케이션 (2)

黄舟
黄舟원래의
2017-02-06 10:40:541056검색

InnoDB는 트랜잭션, 행 잠금 및 테이블 잠금을 지원합니다. MyISAM은 트랜잭션을 지원하지 않고 테이블 잠금만 지원합니다. 여기서는 InnoDB만 소개합니다.

InnoDB는 다음 두 가지 유형의 행 잠금을 구현합니다.

  • 공유 잠금(S): 하나의 트랜잭션이 행을 읽을 수 있도록 허용하고 다른 트랜잭션이 동일한 데이터 세트에 대해 배타적 잠금을 획득하는 것을 방지합니다.

  • 배타적 잠금(X): 배타적 잠금을 획득한 트랜잭션이 데이터를 업데이트하도록 허용하고, 다른 트랜잭션이 동일한 데이터 세트에 대해 공유 읽기 잠금 및 배타적 쓰기 잠금을 획득하지 못하도록 합니다.

또한 행 잠금과 테이블 잠금이 공존할 수 있도록 하고 다단계 잠금 메커니즘을 구현하기 위해 InnoDB에는 내부적으로 사용되는 두 가지 의도 잠금(Intention Locks)도 있습니다. 자물쇠는 테이블 자물쇠예요.

  • 의도 공유 잠금(IS): 트랜잭션은 공유 잠금을 추가하기 전에 먼저 테이블의 IS 잠금을 데이터 행에 추가하려고 합니다. 데이터 행.

  • 의도 배타적 잠금(IX): 트랜잭션은 배타적 잠금을 추가하기 전에 먼저 테이블의 IX 잠금을 획득해야 합니다. 데이터 행.

InnoDB 행 잠금 모드 호환성 목록

请求锁模式

 

   是否兼容

 

当前锁模式

X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容 冲突 兼容
S 冲突 冲突 兼容 兼容
IS 冲突 兼容 兼容 兼容
잠금 모드 요청

호환되나요
  • 현재 잠금 모드
X IX S IS
X 충돌 충돌 충돌 충돌
IX 충돌 호환 가능 충돌 호환 가능
S 충돌 충돌 호환 가능 호환 가능
IS 충돌 호환 가능 호환 가능 호환 가능
  • 트랜잭션에서 요청한 잠금 모드가 현재 잠금과 호환되는 경우 InnoDB는 요청된 잠금을 트랜잭션에 부여합니다. 그렇지 않고 둘이 호환되지 않으면 트랜잭션은 잠금이 해제될 때까지 기다립니다.

    참고:
  • 의도 잠금은 InnoDB에 의해 자동으로 추가되며 사용자 개입이 필요하지 않습니다.
  • UPDATE, DELETE 및 INSERT 문의 경우 InnoDB는 관련 데이터 세트에 배타적 잠금(X)을 자동으로 추가합니다.
  • 일반적인 SELECT 문의 경우 InnoDB는 잠금을 추가하지 않습니다.
    • InnoDB 행 잠금은 인덱스의 인덱스 항목을 잠그는 방식으로 구현됩니다. 따라서 InnoDB의 행 잠금 구현 기능은 InnoDB가 행 수준의 데이터 검색에만 인덱스 조건을 사용한다는 의미입니다. 그렇지 않으면 InnoDB는 테이블 잠금을 사용합니다.
    • 또한 트랜잭션은 다음 명령문을 통해 레코드 세트에 공유 잠금 또는 배타적 잠금을 명시적으로 추가할 수 있습니다.


    공유 잠금(S): SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE.

    배타적 잠금(X): SELECT * FROM table_name WHERE ... FOR UPDATE.


    공유 잠금을 얻으려면 SELECT ... IN SHARE MODE를 사용하세요. 이는 주로 데이터 종속성에서 레코드 행이 존재하는지 확인하는 데 사용됩니다. 이 레코드에 대해 UPDATE 또는 DELETE 작업을 수행하는 사람이 없는지 확인하세요. 그러나 현재 트랜잭션에서도 레코드를 업데이트해야 하는 경우 교착 상태가 발생할 수 있습니다. 행 레코드를 잠근 후 업데이트해야 하는 응용 프로그램의 경우 SELECT... FOR UPDATE 메서드를 사용하여 배타적 잠금을 얻어야 합니다. . 위 내용은 MySQL 트랜잭션, 잠금 및 애플리케이션 내용입니다(2). 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!
    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.