참고
https://hackernoon.com/optimistic-and-pessimistic-locking-in-jpa
[Real MySQL 8.0] https://link.coupang.com/a/GW7Yc
https://zzang9ha.tistory.com/381
https://www.baeldung.com/jpa-optimistic-locking
https://www.baeldung.com/jpa-pessimistic-locking
https://www.baeldung.com/java-jpa-transaction-locks
잠금(락)과 트랜잭션, 격리수준
동시성에 영향을 미치는 요소에는 잠금과 트랜잭션, 트랜잭션의 격리 수준이 있습니다.
트랜잭션: 작업의 완전성을 보장해주는 일련의 처리과정
잠금(락): 여러 커넥션에서 동일한 자원에 접근 및 변경 시 순차적으로 처리하도록 제어하는 기능
격리수준: 트랜잭션 간의 작업내용을 어떻게 공유하고 차단할지 결정하는 레벨
데이터베이스의 격리 수준
데이터베이스의 부정합 세 가지
정합성 : 어떤 데이터들의 값이 일치하는지의 성질
데이터베이스에서는 대표적으로 세 가지 부정합이 존재합니다.
- Dirty Read : 아직 커밋되지 않은 수정중인 데이터를 다른 트랜잭션이 읽는 경우 발생하며 데이터베이스에 저장된 값과 읽은 값이 다른 부정합이 발생합니다.
- Non-Repeatable Read : 한 트랜잭션 내에서 같은 쿼리를 두번 실행했을 때, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 경우 첫 번째 쿼리와 두 번째 쿼리의 결과값이 다른 비일관적인 상태를 말합니다.
- Phantom Read : 한 트랜잭션안에서 일정범위의 레코드를 두번 이상 읽거나, 첫 번째 쿼리에서 없던 유령 레코드가 두 번째 쿼리에 나나는 현상을 말합니다.
MySQL 격리 수준
MySQL의 InnoDB 스토리지 엔진에서는 기본적으로 'Repeatable Read' 격리수준을 사용합니다.
격리 수준 | Read Uncommited | Read Commited | Repeatable Read | Serializable |
특징 | 아직 커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 것을 허용 | 대부분의 DBMS가 채택하는 격리 수준으로 커밋이 완료된 데이터만 읽을 수 있도록 허용 | 선행 트랜잭션이 읽은 데이터는 다른 트랜잭션이 갱신하는 동작을 방지 | 선행 트랜잭션이 읽은 데이터를 다른 트랜잭션이 갱신, 삽입등을 모두 방지 |
발생할 수 있는 부정합 | Dirty Read Non-Repeatable Read Phantom Read |
Non-Repeatable Read Phantom Read |
Phantom Read |
잠금(락)을 사용하는 이유
동시성을 제어하는 방법으로 락과 격리수준 설정이 있습니다.
격리 수준은 데이터베이스 연결 시에 셋팅 된 격리수준으로 연결 된 모든 명령문(SQL)에 영향을 끼칩니다.
동시성 제어가 필요 없는 다른 명령문(SQL)에 배타적을 데이터를 접근할 수 있는 방법으로 잠금(락)을 이용합니다.
잠금(락)의 종류
낙관적 락(Optimistic Lock)
2022.12.07 - [Spring/JPA] - [Lock] 동시성 제어를 위한 JPA Lock 2. 낙관적 락(Optimistic Lock)
비관적 락(Pessimistic Lock)
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Spring > JPA' 카테고리의 다른 글
[Lock] 동시성 제어를 위한 JPA Lock 3. 비관적 락(Pessimistic Lock) (0) | 2022.12.08 |
---|---|
[Lock] 동시성 제어를 위한 JPA Lock 2. 낙관적 락(Optimistic Lock) (0) | 2022.12.07 |
식별 관계 비식별 관계 (0) | 2021.07.13 |
[JPA 연관관계매핑] 단방향, 양방향 연관 관계 매핑 (0) | 2021.04.11 |
[JPA] Hibernate의 ddl-auto (0) | 2021.04.09 |