낙관 자물쇠 와 비관 자물쇠

비관 적 자물쇠
비관 자물쇠(Pessimstic Lock)는 데 이 터 를 받 을 때마다 다른 사람 이 수정 할 까 봐 데 이 터 를 받 을 때마다 자 물 쇠 를 채 워 자신 이 사용 하 는 과정 에서 수정 되 지 않도록 하고 사용 후 자 물 쇠 를 풀 어 준다.비관 적 인 자물쇠 에서 흔히 볼 수 있 는 실현 장면:
a.데이터베이스:select...for update;트 랜 잭 션 commt 나 rollback 까지 잠 그 기
  • b.synchronized:조작 하기 전에 동기 화 자 물 쇠 를 먼저 올 립 니 다
  • c.분포 식 자물쇠:조작 전에 분포 식 자 물 쇠 를 먼저 올 리 고 조작 이 끝 난 후에 자 물 쇠 를 방출 한다첫 번 째 데이터베이스 층 의 비관 적 인 자 물 쇠 를 예 로 들 면 관계 형 데이터베이스 에서 비관 적 인 병행 제어(Pessimtic Concurrency Control,약자 PCC)는 비관 적 인 자물쇠 라 고 불 린 다.이것 은 데이터베이스 층 의 병행 제어 방법 이다.만약 에 한 업무 수행 이 한 줄 의 데이터 에 자 물 쇠 를 채 우 면 이 업무 가 자 물 쇠 를 풀 어야 한다.다른 사무 에서 야 이 자물쇠 와 충돌 하 는 작업 을 수행 할 수 있 습 니 다.
    본 고 는 MySQL InnoDB 를 사용 하여 테스트 를 하고 MySQL 은 기본적으로 autocommt 모드 를 사용 합 니 다.즉,업데이트 작업 을 실행 하면 MySQL 은 즉시 결 과 를 제출 하기 때문에 테스트 를 편리 하 게 하기 위해 자동 제출 모드 를 닫 아야 합 니 다.
    MySQL-console 1 오픈:
    mysql> set autocommit=0;
    

    만 든 테스트 데 이 터 는 다음 과 같 습 니 다.
    mysql> select * from user;
    ---
    +----+---------+-----+
    | id | name    | age |
    +----+---------+-----+
    |  1 | hehe    |  29 |
    |  2 | Tonglin |  25 |
    +----+---------+-----+
    

    트 랜 잭 션 시작 및 실행:
    mysql> begin; #  begin work/start transaction
    mysql> select * from user where id=1 for update;
    mysql> update user set age=100 where id=1;
    

    이 때 MySQL-console 2 를 열 어 같은 줄 의 기록 을 조회 하거나 수정 합 니 다.
    mysql> select * from user where id=1;
    ---
    +----+------+-----+
    | id | name | age |
    +----+------+-----+
    |  1 | hehe |  29 |
    +----+------+-----+
    1 row in set (0.00 sec)
    
    mysql> update user set age=99 where id=1;
    ---
    
    

    MySQL-console 2 에 서 는 id=1 의 기록 을 조회 할 수 있 으 나,수정 작업 은 MySQL-console 1 의 트 랜 잭 션 이 제출 되 거나 스크롤 백 될 때 까지 막 힐 수 있 습 니 다.
    MySQL-console1:
    mysql> commit; # commit work,   rollback
    

    MySQL-console2:
    mysql> update user set age=99 where id=1;
    ---
    Query OK, 1 row affected (0.00 sec)
    

    2.낙 관 자물쇠
    낙관 형 잠 금(Optimistic Lock)은 데 이 터 를 가 져 올 때마다 다른 사람 이 수정 하 는 것 을 전혀 걱정 하지 않 기 때문에 데 이 터 를 가 져 올 때마다 잠 그 지 않 지만,데 이 터 를 업데이트 할 때 다른 사람 이 수 정 했 는 지 여 부 를 판단 하 며 그 사이 에 데 이 터 를 다른 사람 이 읽 을 수 있다.비관 적 인 자물쇠 에서 흔히 볼 수 있 는 실현 장면:
    데이터베이스:버 전 번호 메커니즘
    b.CAS 조작여전히 데이터베이스 의 경우 관계 형 데이터베이스 에 서 는 낙관 형 병발 제어(Optimistic Concurrency Control·OCC 로 약자)를 낙관 형 잠 금 이 라 고 부른다.데이터베이스 업 데 이 트 를 제출 하기 전에 다른 트 랜 잭 션 이 데 이 터 를 수 정 했 는 지 확인 하고 업데이트 가 있 으 면 현재 제출 한 트 랜 잭 션 을 스크롤 백 합 니 다.
    우선 데이터베이스 시트 에 version 필드 를 추가 합 니 다:
    mysql> select * from user;
    ---
    +----+---------+-----+---------+
    | id | name    | age | version |
    +----+---------+-----+---------+
    |  1 | hehe    |  99 |       0 |
    |  2 | Tonglin |  25 |       0 |
    +----+---------+-----+---------+
    

    업 데 이 트 를 실행 하기 전에 데이터 베 이 스 를 조회 하고 버 전 번호 version 필드 를 함께 읽 으 며 데 이 터 를 업데이트 할 때마다 version 값 을 1 로 추가 합 니 다.동시 다발 장면 을 모 의 하면 두 스 레 드 가 같은 기록 데 이 터 를 읽 었 다 고 가정 하고 해당 메 인 키(id=1)와 버 전 번호(version=1)를 수정 하고 버 전 번 호 를 1 로 추가 하면 첫 번 째 실행 스 레 드 만 성공 할 수 있 고 두 번 째 스 레 드 가 실 행 될 때 버 전 번호 가 2 로 바 뀌 어서 업데이트 에 실 패 했 습 니 다.
    select * from user where id=1;
    ---
    +----+------+-----+---------+
    | id | name | age | version |
    +----+------+-----+---------+
    |  1 | hehe |   1 |       1 |
    +----+------+-----+---------+
    
    mysql> update user set age=2, version=version+1 where id=1 and version=1;
    ---
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update user set age=3, version=version+1 where id=1 and version=1;
    ---
    Query OK, 0 rows affected (0.00 sec)
    Rows matched: 0  Changed: 0  Warnings: 0
    

    3.장단 점 비교
    두 가지 자 물 쇠 는 각각 장단 점 이 있 기 때문에 단순히 어느 것 이 더 좋다 고 말 할 수 없고 구체 적 인 업무 장면 에 따라 어떤 자 물 쇠 를 사용 할 지 결정 해 야 한다.
    4.567917.3.1 낙관적 인 자 물 쇠 는 데이터 수정 이 비교적 적 고 자주 읽 는 장면 에 적합 하 다.소량의 쓰기 충돌 이 발생 하 더 라 도 대량의 자물쇠 비용 을 절약 하기 때문에 시스템 의 스루풋 을 높 였 다
    4.567917.3.2 비관 적 인 자 물 쇠 는 데이터 수정 이 비교적 많은 장면 에 적합 하 다.비관 적 인 자 물 쇠 는 자물쇠 기록 을 통 해 충돌 을 감소 하고 상층 retry 를 감소 하 며 시스템 성능 을 향상 시 킬 수 있다
    레 퍼 런 스
    아 리 운-비관 자물쇠 와 낙관 자물쇠고서-비관 자물쇠 낙관 자물쇠
    비관 자물쇠 낙관 자물쇠

    좋은 웹페이지 즐겨찾기