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 의 시계 잠 금 은 두 가지 모드 가 있 습 니 다.
자물쇠
자물쇠 가 생기 고 자물쇠 충돌 이 발생 할 확률 이 낮 으 며 병발 이 높다.
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 updateselection 문 구 를 추가 한 후 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
줄 잠 금 의 실현 에 주의 할 필요 가 있 습 니 다: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 의 업데이트 작업 이 실 행 됩 니 다.제안:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.