데이터베이스 (6) 썸네일형 리스트형 [transaction 동시성 문제⑥] 테스트 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 해결-2 에서는 트랜잭션 동시성 문제를 해결하였습니다. 하지만 데드락이 발생하는 문제를 겪었습니다. 그래서 데드락-2 에서는 데드락 문제를 해결하는 여러 방법에 대해 고민해보았고, 결국 쿼리 순서를 바꿔서 해결하는 방법을 선택했습니다. 이번 글에서는 이 해결방법이 실제로 잘 적용되는지 확인해보겠습니다. 먼저 Cabinet 엔터티의 정의입니다. @Version 어노테이션 덕분에 (속성 값 변경시) version 값이 자동으로 +1 증가됩니다. @Entity @Table(name = "CABINET") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter publi.. [transaction 동시성 문제⑤] 데드락 - 2 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 이전 글에서는 해결방법-2 글에서 발생한 데드락이 왜 발생한 것인지 추측해보았습니다. 하지만 틀린 추측이었습니다. 이번 글에서는 데드락이 왜 발생했는지 정확한 원인을 짚어보겠습니다. 일단 외래키 제약에 대해 알아보겠습니다. mysql 공식문서에서는 외래키 제약을 이렇게 정의합니다. MySQL supports foreign keys, which permit cross-referencing related data across tables, and foreign key constraints, which help keep the related data consistent" help keep the related data.. [transaction 동시성 문제④] 데드락 - 1 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 이전 해결방법-2 글에서는 해결방법-1 보다 발전된 낙관적 락 구현 방법을 얘기했습니다. 하지만 이 방법은 치명적인 단점인 데드락 발생 문제가 있습니다. 이번 글에서는 데드락이 왜 발생했는지 원인과 시나리오를 살펴보겠습니다. 먼저 데드락이 무엇인지 간단하게 살펴보겠습니다. 멀티쓰레드 환경에서 공유자원이 있을 때, 동시성 문제가 발생할 수 있습니다. 이 문제를 예방하기 위해 lock 기법을 도입할 수 있습니다. 공유자원에 접근하기 위해선 lock이라는 특수한 자원을 획득해야 하고, 공유자원에 대한 읽기, 수정 작업이 끝나면 lock을 내려 놓습니다. 이렇게 한 쓰레드가 lock을 획득하면, 이 쓰레드가 lock을 .. [transaction 동시성 문제③] 해결 - 2 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 해결 방법 - 2 lentHistory 테이블은 그대로 둡니다. lent_history_id user_id cabinet_id started_at ``` cabinet에 version 컬럼, activeLentCount 컬럼 추가합니다. cabinet_id status version max_user active_lent_count ``` 이렇게 테이블을 수정하고 기존 동시성 문제 시나리오를 다시 살펴보겠습니다. cabinet 동시성 문제 1 전제: N번 공유사물함은 최대 3명이 빌릴 수 있습니다. 현재 2명이 대여 중입니다. lent_history_id user_id cabinet_id started_at ```.. [transaction 동시성 문제②] 해결 - 1 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 참고 대여처리는 (userId, cabinetId 포함한 각종 정보를 담은) row를 lent_history 테이블에 추가하는 작업입니다. 해결 방법 lent_history에 version 컬럼 추가 두 컬럼 {version, cabinetId}에 composite unique index lent_history_id user_id cabinet_id version started_at ``` cabinet에 version 컬럼 추가 cabinet_id status version max_user ``` 이렇게 테이블을 수정하고 기존 동시성 문제 시나리오를 다시 살펴보겠습니다. cabinet 동시성 문제 1 전제: N.. [transaction 동시성 문제①] 원인 이 시리즈는 데이터베이스 동시성 문제를 겪은 경험과 그 해결책에 대한 내용이 담겨 있습니다. 동시성 문제 공유자원에서 값을 읽고, 그 값 이용하여 연산 혹은 분기문을 수행 이러한 상황에서 동시성 문제가 발생할 수 있습니다. 여기서 공유자원은 전역변수나 데이터베이스 등이 될 수 있습니다. 아래는 cabinet 대여 정책 입니다. 각 사물함은 빌릴 수 있는 최대 인원수가 정해져 있습니다. activeLentCount(현재 해당 사물함을 빌리고 있는 대여자 수) ≤ cabinet.maxUser activeLentCount 값에 따라 cabinet.status 값이 정해져 있습니다. activeLentCount < cabinet.maxUser → cabinet.status = AVAILABLE activeLen.. 이전 1 다음