MySQL 행 자물쇠 와 표 자물쇠 의 의미 및 차이 점 상세 설명

머리말
행 자물쇠 와 표 자물쇠 의 의미 차이 에 대해 면접 에서 고주파 로 나타 나 야 한다.우 리 는 MySQL 의 자물쇠 에 대해 체계 적 인 인식 을 가지 고 더욱 상세 한 것 은 스스로 자 료 를 조회 해 야 한다.본 편 은 개괄적 인 총 결 대답 이다.
MySQL 상용 엔진 은 MyISAM 과 InnoDB 가 있 고,InnoDB 는 mysql 기본 엔진 입 니 다.MyISAM 은 줄 잠 금 을 지원 하지 않 고,InnoDB 는 줄 잠 금과 시계 잠 금 을 지원 합 니 다.
다른 데이터 베이스 에 비해 MySQL 의 잠 금 체 제 는 비교적 간단 하 며 가장 현저 한 특징 은 서로 다른 저장 엔진 이 서로 다른 잠 금 체 제 를 지원 하 는 것 이다.
MySQL 은 크게 다음 과 같은 3 가지 자물쇠 로 요약 할 수 있 습 니 다.
  • 시계 급 자물쇠:비용 이 적 고 자물쇠 가 빠르다.자물쇠 가 나타 나 지 않 습 니 다.잠 금 입도 가 크 고 잠 금 충돌 이 발생 할 확률 이 가장 높 으 며 병발 도가 가장 낮다.
  • 줄 잠 금:비용 이 많이 들 고 잠 금 이 느 립 니 다.자물쇠 가 생 긴 다;잠 금 입도 가 가장 작고 잠 금 충돌 이 발생 할 확률 이 가장 낮 으 며 병발 도도 가장 높다.
  • 페이지 잠 금:비용 과 잠 금 시간 은 시계 잠 금 과 줄 잠 금 사이 에 있 습 니 다.자물쇠 가 생 긴 다;잠 금 입도 계 는 시계 자물쇠 와 행 자물쇠 사이 에 있 고 병발 도 는 보통
  • 어떻게 자 물 쇠 를 넣 습 니까?
    MyISAM 은 검색 어(SELECT)를 실행 하기 전에 관련 된 모든 표 에 자동 으로 읽 기 자 물 쇠 를 추가 하고 업데이트 작업(UPDATE,DELETE,INSERT 등)을 수행 하기 전에 관련 된 표 에 자동 으로 자 물 쇠 를 추가 합 니 다.이 과정 은 사용자 가 관여 할 필요 가 없 기 때문에 사용 자 는 보통 LOCK TABLE 명령 으로 MyISAM 표 현 식 자 물 쇠 를 추가 할 필요 가 없습니다.
    명시 적 잠 금:
    공유 자물쇠(자물쇠 읽 기)의 쓰기:lock in share mode,예 를 들 어:
    
    select math from zje where math>60 lock in share mode;
    
    위 에 있 는 자물쇠(자물쇠 쓰기)의 쓰기:for update,예 를 들 어:
    
    select math from zje where math >60 for update;
    시계 자물쇠
    자물쇠 가 생기 지 않 습 니 다.자물쇠 충돌 이 발생 할 확률 이 높 고 병발 이 낮 습 니 다.
    MyISAM 엔진
    MyISAM 은 검색 어(select)를 실행 하기 전에 관련 된 모든 표 에 읽 기 자 물 쇠 를 자동 으로 추가 하고,삭제 수정 작업 을 수행 하기 전에 관련 된 표 에 자동 으로 자 물 쇠 를 추가 합 니 다.
    MySQL 의 시계 잠 금 은 두 가지 모드 가 있 습 니 다.
  • 표 공유 읽 기 자물쇠
  • 표 독점 자물쇠
  • 자 물 쇠 를 읽 으 면 쓰기 가 막 히 고 자 물 쇠 를 쓰 면 읽 기와 쓰기 가 막힌다.
  • MyISAM 표 에 대한 읽 기 동작 은 같은 표 에 대한 다른 프로 세 스 의 읽 기 요청 을 막 지 않 지만 같은 표 에 대한 쓰기 요청 을 막 을 수 있 습 니 다.읽 기 잠 금 이 풀 려 야 다른 프로 세 스 의 쓰기 동작 을 수행 할 수 있 습 니 다.
  • MyISAM 표 에 대한 쓰기 동작 은 다른 프로 세 스 가 같은 표 에 대한 읽 기와 쓰기 동작 을 막 을 수 있 습 니 다.잠 금 이 풀 려 야 다른 프로 세 스 의 읽 기와 쓰기 동작 을 수행 할 수 있 습 니 다.
  • MyISAM 은 주 표를 쓰 는 엔진 에 적합 하지 않 습 니 다.자 물 쇠 를 쓴 후에 다른 스 레 드 는 어떠한 조작 도 할 수 없 기 때문에 대량의 업데이트 로 인해 조회 가 자 물 쇠 를 얻 기 어렵 고 영원히 막 힐 수 있 습 니 다.
    자물쇠
    자물쇠 가 생기 고 자물쇠 충돌 이 발생 할 확률 이 낮 으 며 병발 이 높다.
    MySQL 의 InnoDB 엔진 에 서 는 줄 자 물 쇠 를 지원 합 니 다.Oracle 과 달리 MySQL 의 줄 자 물 쇠 는 색인 을 통 해 불 러 옵 니 다.즉,줄 자 물 쇠 는 색인 응답 줄 에 추 가 됩 니 다.해당 하 는 SQL 문 구 는 색인 이 없 으 면 전체 표 스 캔 을 하고 줄 자 물 쇠 는 이 루어 지지 않 습 니 다.대신 표 자물쇠 입 니 다.이때 다른 사 무 는 현재 표를 업데이트 하거나 삽입 할 수 없습니다.
    
    CREATE TABLE `user` (
    `name` VARCHAR(32) DEFAULT NULL,
    `count` INT(11) DEFAULT NULL,
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
    ) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
    
    --   ,     user ,   id
    
     
    
    -- A          ,      
    update user set count=10 where id=1;
    -- B          
    update user set count=10 where id=2;
    --           ,    ,A B        ,B           
    
     
    
    -- A  name      ,      
    update user set count=10 where name='xxx';
    -- B          
    update user set count=10 where id=2;
    --               ,       ,
    -- B               ,   A     ,B      
    for update
    selection 문 구 를 추가 한 후 for update 를 추가 하면 조 회 된 데 이 터 는 열 쇠 를 추가 합 니 다.다른 사 무 는 읽 을 수 있 지만 업데이트 와 삽입 작업 은 할 수 없습니다.
    
    -- A   id=1       
    select * from user where id=1 for update;
    
    -- B            
    update user set count=10 where id=1;
    
    -- A  commit   B            
    
    
    줄 잠 금 의 실현 에 주의 할 필요 가 있 습 니 다:
  • 줄 자 물 쇠 는 색인 이 있어 야 실현 할 수 있 습 니 다.그렇지 않 으 면 자동 으로 시계 전 체 를 잠 글 수 있 습 니 다.그러면 줄 자물쇠 가 아 닙 니 다.
  • 두 사 무 는 같은 색인 을 잠 글 수 없습니다.
  • insert,delete,update 는 트 랜 잭 션 에서 자동 으로 잠 금 을 기본 값 으로 추가 합 니 다.
  • 줄 잠 금 필드:
    A.사용자 소비,service 층 은 먼저 해당 사용자 의 계좌 잔액 을 조회 하고 잔액 이 충분 하면 후속 적 인 공제 작업 을 한다.이런 상황 을 조회 할 때 는 이 기록 에 자 물 쇠 를 채 워 야 한다.
    그렇지 않 으 면 B 사용자 가 A 사용자 조회 후 소비 하기 전에 먼저 A 사용자 계 정 에 있 는 돈 을 빼 돌 렸 는데 이때 A 사용자 가 사용자 잔액 이 충분 한 지 판단 을 했 기 때문에 잔액 이 부족 한데 도 공제 에 성공 하 는 상황 이 발생 할 수 있다.
    이 를 피하 기 위해 서 는 A 사용자 가 이 기록 을 조작 할 때 for update 잠 금 추가 가 필요 합 니 다.
    확장:간극 잠 금
    같은 조건 이 아 닌 범위 조건 으로 데 이 터 를 검색 하고 공유 또는 배타 적 자 물 쇠 를 요청 할 때 InnoDB 는 조건 에 맞 는 기 존 데이터 기록 의 색인 항목 에 자 물 쇠 를 추가 합 니 다.키 값 이 조건 범위 내 에 존재 하지 않 는 기록 을 간극 이 라 고 합 니 다.
    InnoDB 도 이'간극'에 자 물 쇠 를 추가 할 것 이다.이런 자물쇠 체 제 는 바로 간극 자물쇠 이다.
    
    --   A
    update user set count=8 where id>2 and id<6
    
    --   B
    update user set count=10 where id=5;
    
    만약 에 사용자 A 가 상기 작업 을 한 후에 사 무 를 제출 하지 않 으 면 B 는 2~6 사이 의 기록 을 업데이트 하거나 기록 을 삽입 할 수 없어 서 막 히 고 A 가 사 무 를 제출 하면 B 의 업데이트 작업 이 실 행 됩 니 다.
    제안:
  • 가능 한 한 모든 데이터 검색 을 색인 을 통 해 완성 하고 색인 없 는 줄 잠 금 이 표 잠 금 으로 업그레이드 되 지 않도록 합 니 다
  • 색인 을 합 리 적 으로 디자인 하고 자물쇠 의 범 위 를 최대한 줄인다
  • 가능 한 한 색인 조건 을 줄 이 고 간극 잠 금
  • 을 피한다.
  • 사무 크기 를 최대한 통제 하고 잠 금 자원 의 양 과 시간 길 이 를 줄인다
  •  이 글 은 MySQL 행 자물쇠 와 표 자물쇠 의 의미 및 차이 점 에 대한 상세 한 설명 을 소개 합 니 다.더 많은 MySQL 행 자물쇠 와 표 자물쇠 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기