반응형

isolation 6

2편. MVCC는 무엇을 해결하고, 무엇을 해결하지 못할까

1편에서 트랜잭션이 왜 본질적으로 느릴 수밖에 없는지, Undo Log와 Redo Log의 비용 관점에서 살펴봤다.이쯤에서 자연스럽게 이런 의문이 든다.“그런데 읽기 트랜잭션은 왜 락 없이도 동작할 수 있을까?”이 질문에 대한 답이 바로 MVCC(Multi-Version Concurrency Control)다.MVCC가 등장한 이유전통적인 락 기반 동시성 제어에서는 읽기와 쓰기가 서로를 쉽게 막는다.읽는 동안 쓰기가 대기한다쓰는 동안 읽기가 대기한다동시 사용자가 늘어날수록, 처리량은 급격히 떨어진다.InnoDB는 이 문제를 해결하기 위해 “락을 덜 거는 방법”이 아니라 과거 버전을 읽게 하는 방법을 선택했다.그 결과물이 MVCC다.MVCC의 핵심 아이디어MVCC의 핵심은 단순하다.“읽을 때 현재 값을 보..

Database/MySQL 2026.02.01

8편. namespace로 나뉜 세계

Linux 공식문서로 다시 이해하는 JVM 서버 실행 환경7편에서 cgroup은 리소스를 “제한”하는 기능이 아니라 프로세스가 어떤 규칙 아래에서 실행되는지 정의하는 시스템이라는 점을 살펴봤다.이번 편에서는 컨테이너의 또 다른 핵심 축인 namespace를 다룬다.cgroup이 “얼마나 쓸 수 있는가”를 정한다면,namespace는 “무엇을 볼 수 있는가”를 정한다.namespace가 없었다면 컨테이너는 존재할 수 없다컨테이너를 처음 접하면 이런 착각을 하기 쉽다.컨테이너는 가벼운 VM이다컨테이너마다 OS가 따로 있다하지만 Linux 관점에서 이는 사실이 아니다.컨테이너는 같은 커널을 공유한다.그럼에도 컨테이너가 서로 완전히 분리된 것처럼 보이는 이유가 바로 namespace다.namespace의 본질n..

[Spring 공식 문서 기반] Transaction 11. 그래도 Isolation을 건드려야 하는 순간

10편에서는 Spring Transaction에서“왜 대부분의 경우 Isolation은 DEFAULT로 두는가”를 현실적인 이유로 살펴봤습니다.요약하면,Isolation은 DB의 영역이고, 애플리케이션은 함부로 개입하지 않는 것이 기본이었습니다.하지만 실무에서는 다음과 같은 질문을 피할 수 없습니다.“그래도 이건 DEFAULT로는 안 되는데?”이번 글에서는정말로 Isolation을 고려해야 하는 순간을 실제 시나리오로 정리해보겠습니다.1. Isolation을 건드리기 전에 반드시 해야 할 것Isolation을 올리는 것은마지막 수단입니다.그래서 공식 문서와 실무에서는 다음 순서를 강하게 권장합니다.비즈니스 제약으로 해결 (UNIQUE, 상태 전이)애플리케이션 레벨 제어그래도 안 되면 Isolation 고..

[Spring 공식 문서 기반] Transaction 10. Isolation은 왜 대부분 신경 쓰지 않아도 될까

9편에서는 rollbackFor / noRollbackFor를 통해“어떤 실패를 트랜잭션 실패로 볼 것인가”를 예외 설계 관점에서 정리했습니다.이제 트랜잭션 옵션 중 마지막으로 남은 축,격리 수준(Isolation)으로 넘어가 보겠습니다.많은 개발자가 Isolation을 보면 이렇게 반응합니다.“이거 중요해 보이는데…근데 실무에서는 거의 안 만지지 않나?”이 인식은거의 맞습니다.이번 글에서는 왜 Spring 공식 문서와 실무 모두에서“Isolation은 대부분 기본값으로 둔다”고 말하는지를 현실적인 이유로 설명해보겠습니다.1. Isolation은 무엇을 제어하는 옵션일까Isolation은“동시에 실행되는 트랜잭션들이 서로의 변경을 어디까지 볼 수 있는가”를 정의하는 옵션입니다.대표적인 격리 수준은 다음 ..

[Spring 공식문서 정리] 11. 트랜잭션 설계 실수 모음 – 왜 이 데이터는 꼬였을까?

7~10편에서는 Spring 트랜잭션의 핵심 요소인프록시 기반 동작롤백 규칙(RuntimeException vs Checked Exception)전파(Propagation)격리 수준(Isolation)을 차례대로 살펴봤습니다.이번 글에서는 이 개념들이 실무에서 어떻게 잘못 사용되는지, 그리고 그 결과로 왜 데이터가 꼬이게 되는지를 대표적인 사례 중심으로 정리해보겠습니다.1. 실수 #1 – 로그도 같이 롤백된다가장 흔한 실수 중 하나는 로그나 이력 저장 로직을 메인 비즈니스 트랜잭션에 그대로 포함시키는 경우입니다.@Transactionalpublic void processOrder() { orderService.createOrder(); logService.saveLog(); // 같은 트랜잭션..

[Spring 공식문서 정리] 10. 트랜잭션 격리 수준은 왜 필요한가 – READ_COMMITTED의 선택 이유

9편에서는 트랜잭션 전파(Propagation)를 통해 Spring이 하나의 요청 안에서 트랜잭션 경계를 어떻게 나누고, 왜 REQUIRED와 REQUIRES_NEW가 존재하는지를 살펴봤습니다.이번 글에서는 트랜잭션 격리 수준(Isolation)을 통해,동시에 여러 트랜잭션이 실행될 때 무엇을 허용하고, 무엇을 막아야 하는가라는 질문에 대해 Spring과 데이터베이스가 어떤 선택을 했는지를 차근차근 정리해보겠습니다.1. 트랜잭션 격리 수준(Isolation)이란 무엇인가격리 수준은 한 트랜잭션이 다른 트랜잭션의 변경 내용을 어디까지 볼 수 있는지를 정의합니다.즉, 격리는정합성의 문제이자동시성의 문제이며성능과 직결된 설계 선택입니다.모든 트랜잭션을 완전히 격리하면 가장 안전하겠지만, 그만큼 동시 처리 성능..

반응형