낙관 자물쇠 와 비관 자물쇠
비관 자물쇠(Pessimstic Lock)는 데 이 터 를 받 을 때마다 다른 사람 이 수정 할 까 봐 데 이 터 를 받 을 때마다 자 물 쇠 를 채 워 자신 이 사용 하 는 과정 에서 수정 되 지 않도록 하고 사용 후 자 물 쇠 를 풀 어 준다.비관 적 인 자물쇠 에서 흔히 볼 수 있 는 실현 장면:
a.데이터베이스:select...for update;트 랜 잭 션 commt 나 rollback 까지 잠 그 기
본 고 는 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 를 감소 하 며 시스템 성능 을 향상 시 킬 수 있다
레 퍼 런 스
아 리 운-비관 자물쇠 와 낙관 자물쇠고서-비관 자물쇠 낙관 자물쇠
비관 자물쇠 낙관 자물쇠
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx websocket ip_해시 규칙프로젝트 를 다운로드 한 후 서로 다른 네트워크 에 각각 이 demo 프로젝트 를 배치 합 니 다. 프로젝트 에서 환경 변수 에 따라 시스템 변 수 를 설정 합 니 다. spring.profiles.active=de...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.