Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 테스트주도개발
- 객체지향의사실과오해
- 책스터디
- 조영호
- Spring
- template
- 스터디
- 클린아키텍처
- 도메인 주도 개발 시작하기
- web
- 유지보수
- 개발서적
- DDD
- 코틀린
- GrokkingFunctionalProgramming
- 만들면서배우는클린아키텍처
- TDD
- 헥사고날아키텍처
- 개발방법론
- 테스트
- Kotlin
- 함수형프로그래밍
- 아키텍처
- 이펙티브코틀린
- 추상화 설계
- FP
- Boot Legacy 차이점
- 계층형아키텍처
- Thymeleaf
- Java
Archives
- Today
- Total
김동형수 개발기
도메인 주도 개발 시작하기 - 8장 본문
8장 애그리거트 트랜잭션 관리
애그리거트와 트랜잭션
한 애그리거트를 두 사용자가 거의 동시에 변경할 때 트랜잭션이 필요하다.한 애그리거트를 두 사용자가 거의 동시에 변경할 때 트랜잭션이 필요하다.
애그리거트에 대해 사용할 수 있는 대표적인 트랜잭션 처리 방식에는 선점(Pressimistic) 잠금과 비선점(Optimistic) 잠금의 두 가지 방식이 있다.
선점 잠금
선점 잠금은 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하는 것을 막는 방식이다.
선점 잠금은 보통 DBMS가 제공하는 행 단위 잠금을 사용해서 구현한다. 오라클을 비롯한 다수 DBMS가 for update와 같은 쿼리르 사용해서 특정 레코드에 한 사용자만 접근할 수 있는 잠금 장치를 제공한다.
선점 잠금 기능을 사용할 떄는 잠금 순서에 따른 교착 상태(dealock)가 발생하지 않도록 주의해야 한다.
잠금을 구할 때 최대 대시 시간을 지정해야 한다.
JPA에서 선점 잠금을 시도할 때 최대 대기 시간을 지정하려면 힌트를 사용하면 된다.
DBMS에 따라 교착 상태에 따라 커넥션을 처리하는 방식이 다르다. 선점 잠금을 사용하려면 사용하는 DBMS에 대해 JPA가 어떤 식으로 대기 시간을 처리하는지 반드시 확인해야 한다.
비선점 잠금
선점 잠금이 강력해 보이긴 하지만 선점 잠금으로 모든 트랜잭션 충돌 문제가 해결되는 것은 아니다.
비선점방식으로 해결할 수 있는데, 변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식이다.
수정할 애그리거트와 매핑되는 테이블의 버전 값이 현재 애그리거트의 버전과 동일한 경우에만 데이터를 수정한다. 그리고 수정에 성공하면 버전 값을 1 증가시킨다.
JPA는 버전을 이용한 비선점 잠금 기능을 지원한다.
JPA는 엔티티가 변경되어 UPDATE 쿼리를 실행할 때 @Version에 명시한 필드를 이용해서 비선점 잠금 쿼리를 실행한다.
수정된 행의 개수가 0이면 이미 누군가 앞서 데이터를 수정한 것이다
트랜잭션이 충돌한 것이므로 트랜잭션 종료 시점에 익셉션이 발생한다. (OptimisticLockingFailureException)
루트가 아닌 다른 엔티티의 값만 변경된다고 하자 그런데 연관된 엔티티의 값이 변경된다고 해도 루트 엔티티 자체의 값은 바뀌는 것이 없으므로 버전 값을 갱신하지 않는다.
애그리거트 내에 어떤 구성요소의 상태가 바뀌면, 루트 애그리거트의 버전 값을 증가해야 비선점 잠금이 올바르게 동작한다
JPA는 이런 문제를 처리할 수 있도로 EntityManager.find() 메서드로 엔티티를 구할때 강제로 버전 값을 증가시키는 잠금 모드를 지원하고 있다.
오프라인 선점 잠금
더 엄격하게 데이터 충돌을 막고 싶다면 누군가 수정화면을 보고 있을 경우 수정 화면 자체를 실행하지 못하도록 해야 한다.
한 트랜잭션 범위에서만 적용되는 선점 잠금 방식이나 나중에 버전 충돌을 확인하는 비선점 잠금 방식으로는 이를 구현할 수 없다. 이때 필요한 것이 오프라인 선점 잠금 방식이다.
오프라인 선점 잠금은 여러 트랜잭션에 걸쳐 동시 변경을 막는다. 잠금을 해제하기 전까지 다른 사용자는 잠금을 구할 수 없다.
'책 스터디 > [완료] DDD - 도메인 주도 개발 시작하기' 카테고리의 다른 글
도메인 주도 개발 시작하기 - 10, 11장 (0) | 2023.05.31 |
---|---|
도메인 주도 개발 시작하기 - 9장 (0) | 2023.05.11 |
도메인 주도 개발 시작하기 - 7장 (0) | 2023.04.12 |
도메인 주도 개발 시작하기 - 6장 (0) | 2023.04.06 |
도메인 주도 개발 시작하기 - 5장 (0) | 2023.03.30 |
Comments