mysql 비관 적 자물쇠 와 낙관적 자물쇠 의 이해 및 응용 분석

본 논문 의 사례 는 my sql 비관 적 인 자물쇠 와 낙관적 인 자 물 쇠 를 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
비관 적 인 자물쇠 와 낙관적 인 자 물 쇠 는 사람들 이 정의 한 개념 으로 하나의 사상 으로 이해 할 수 있 고 합병 자원 을 처리 하 는 데 자주 사용 되 는 수단 이다.
그들 을 mysql 에서 제공 하 는 자물쇠 메커니즘(시계 자물쇠,줄 자물쇠,배타 자물쇠,공유 자물쇠)과 혼동 하지 마라.
비관 적 자물쇠
말 그대로 데이터 처리 에 대해 비관 적 인 태 도 를 취하 고 동시 충돌 이 발생 할 것 이 라 고 생각 하 며 데 이 터 를 얻 고 수정 할 때 다른 사람 이 데 이 터 를 수정 하 는 것 이다.따라서 전체 데이터 처리 과정 에서 데 이 터 를 잠 가 야 합 니 다.
비관 적 자물쇠 의 실현 은 보통 데이터베이스 가 제공 하 는 자물쇠 체제 에 의 해 이 루어 진다.예 를 들 어 my sql 의 배타 적 자물쇠,select...for update 로 비관 적 자 물 쇠 를 실현 한다.
예:상품 을 순식간에 죽 이 는 과정 에서 재고 수량 이 감소 하여 초과 판매 상황 이 발생 하지 않도록 한다.

CREATE TABLE `tb_goods_stock` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '  ID',
 `nums` int(11) unsigned DEFAULT '0' COMMENT '      ',
 `create_time` datetime DEFAULT NULL COMMENT '    ',
 `modify_time` datetime DEFAULT NULL COMMENT '    ',
 PRIMARY KEY (`id`),
 UNIQUE KEY `goods_id` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='     ';
상품 재고 수량 nums 필드 유형 을 unsigned 로 설정 하여 데이터베이스 차원 에서 마이너스 가 발생 하지 않도록 합 니 다.
비관 적 인 자 물 쇠 를 사용 하려 면 my sql 의 자동 제출 기능 을 닫 고 set autocommt=0 을 사용 해 야 합 니 다.
my sql 의 줄 잠 금 은 색인 을 기반 으로 합 니 다.sql 에서 색인 을 찾 지 않 으 면 표 급 잠 금 을 사용 하여 전체 시 계 를 잠 글 것 입 니 다.
1.업 무 를 시작 하여 판매 할 상품 을 조회 하고 이 기록 에 자 물 쇠 를 추가 합 니 다.

begin;
select nums from tb_goods_stock where goods_id = {$goods_id} for update;
2.상품 수량 이 구 매 수량 보다 많은 지 판단 한다.만약 만족 하지 않 는 다 면,다시 일 을 처리 해라.
3.조건 을 만족 시 키 면 재 고 를 줄 이 고 업 무 를 제출한다.

update tb_goods_stock set nums = nums - {$num} 
where goods_id = {$goods_id} and nums >= {$num};
commit;
트 랜 잭 션 을 제출 할 때 트 랜 잭 션 의 자 물 쇠 를 풀 어 줍 니 다.
비관 적 인 자 물 쇠 는 병발 통제 에 있어 서 먼저 자 물 쇠 를 잠 근 다음 에 데 이 터 를 처리 하 는 보수 적 인 전략 을 채택 하여 데이터 처리 의 안전성 을 보장 하지만 효율 도 떨 어 뜨 렸 다.
2.낙 관 자물쇠
말 그대로 데이터 처리 에 대해 낙관적 이 고 데이터 가 일반적으로 충돌 하지 않 을 것 이 라 고 낙관 하 며 데이터 업 데 이 트 를 제출 할 때 만 데이터 충돌 여 부 를 점검 하 는 것 이다.
충돌 이 발견 되면 오류 정 보 를 사용자 에 게 되 돌려 주 고 사용자 가 스스로 어떻게 조작 할 지 결정 하도록 합 니 다.
낙관적 인 자물쇠 의 실현 은 데이터 베이스 가 제공 하 는 자물쇠 체제 에 의존 하지 않 고 우리 가 스스로 실현 해 야 한다.실현 방식 은 보통 데이터 버 전 을 기록 하 는 것 이 고 하 나 는 버 전 번 호 를 통 해 하 나 는 시간 스탬프 를 통 해 이 루어 진다.
표 에 버 전 번호 나 시간 스탬프 필드 를 추가 하고 데 이 터 를 읽 을 때 버 전 번 호 를 함께 읽 고 데 이 터 를 업데이트 할 때 버 전 번 호 를 1 추가 합 니 다.
데이터 업 데 이 트 를 제출 할 때 현재 버 전 번호 가 처음 읽 은 버 전 번호 와 같 는 지 판단 합 니 다.만약 같다 면 업 데 이 트 를 해 야 한다.그렇지 않 으 면 데이터 가 만 료 되 었 다 고 생각 하고 업 데 이 트 를 거부 하여 사용자 가 다시 조작 하도록 한다.

CREATE TABLE `tb_goods_stock` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '  ID',
 `nums` int(11) unsigned DEFAULT '0' COMMENT '      ',
 `create_time` datetime DEFAULT NULL COMMENT '    ',
 `modify_time` datetime DEFAULT NULL COMMENT '    ',
 `version` bigint(20) unsigned DEFAULT '0' COMMENT '   ',
 PRIMARY KEY (`id`),
 UNIQUE KEY `goods_id` (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='     ';
1.판매 할 상품 을 조회 하고 버 전 번 호 를 받 습 니 다.

begin;
select nums, version from tb_goods_stock where goods_id = {$goods_id};
2.상품 수량 이 구 매 수량 보다 많은 지 판단 한다.만약 만족 하지 않 는 다 면,다시 일 을 처리 해라.
3.조건 을 만족 시 키 면 재 고 를 줄인다.(업데이트 시 현재 version 과 첫 번 째 단계 에서 가 져 온 version 이 같은 지 판단 합 니 다)

update tb_goods_stock set nums = nums - {$num}, version = version + 1 
where goods_id = {$goods_id} 
and version = {$version} and nums >= {$num};
4.업데이트 작업 이 성공 적 으로 실행 되 었 는 지 판단 하고 성공 하면 제출 하 며 그렇지 않 으 면 스크롤 백 합 니 다.
낙관적 인 자 물 쇠 는 프로그램 을 바탕 으로 이 루어 진 것 이기 때문에 자물쇠 가 없 는 상황 이 존재 하지 않 고 많이 읽 는 응용 장면 에 적용 된다.충돌 이 자주 발생 하면 상층 응용 이 사용자 에 게 재 작업 을 시 키 는 것 이 오히려 성능 을 떨 어 뜨리 는 상황 에서 비관 적 인 자물쇠 가 적용 된다.
더 많은 MySQL 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 MySQL 데이터베이스 계획 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기