본문 바로가기

분류 전체보기210

동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기 쓰기락과 읽기락 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요 → 락을 잡는동안 수행하는 작업의 범위를 최소화 하는 것 락의 범위가 크면 클수록 락을 획득하기 위한 여러 트랜잭션들이 대기하는 시간이 길어짐 → 그만큼 성능도 내려간다. 락의 범위가 길어질수록 Connection Pool을 점유하는 시간이 길어짐 → 최악의 경우에는 Connection Pool 고갈로 이어질 수 있음 MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀림 → 트랜잭션이 곧 락의 범위 따라서 여기서는 락의 범위를 최소화 한다는 것은 하나의 트랜잭션을 최소화 한다는 것임 예시) 만약 S3이미지를 업로드 한다고 했을 때 이것이 트랜잭션 범위안.. 2023. 6. 7.
동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해 대부분 하나의 웹 서버는 여러 개의 요청을 동시에 수행할 수 있다. → 작성한 코드 한 줄은 동시에 수행 될 수 있다. → 하나의 자원을 두고 여러 개의 연산들이 경합을 하기 때문에 데이터 정합성을 깨뜨릴 수 있다. 예제를 통해 위의 상황을 이해해보자. 예제) 상황 : 100원을 출금하는 요청이 동시에 발생 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인 → 잔고가 넉넉한지를 확인 → 출금금액 만큼 기존의 잔고에서 빼주어서 홍길동의 잔고를 UPDATE 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인하는 과정 바로 후에 두번째 트랜잭션이 홍길동의 잔고를 읽는 상황이 발생했다고 가정 첫번째 트랜잭션은 그대로 100원을 빼고 900원을 업데이트함 두번째 트랜잭션은 잔고가 1000원으로 확인되.. 2023. 6. 7.
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 04. 트랜잭션 격리레벨 Isolation - 트랜잭션은 서로 간섭하지 않고 독립적으로 동작한다. READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE READ 위의 4가지는 Dirty Read Non Repeatable Read Phantom READ 이 3가지 중 몇가지를 방지하는가 혹은 허용하는가로 격리레벨이 결정된다. Dirty Read 예제) 홍길동이 김국밥에게 900원을 송금하는 상황 트랜잭션 격리레벨은 여러 트랜잭션들이 존재할 때 서로 간섭하지 않는가이다. 트랜잭션 2개가 거의 비슷한 시간에 진입했다고 가정해보자. 첫번째 트랜잭션 : 900원을 출금시키기 위해 홍길동의 잔고(1000원)를 가져옴 그리고 곧바로 900원을 이체시키기 위해 김국밥 잔액에 900원을 .. 2023. 6. 7.
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 02. 트랜잭션 A, C, I, D 트랜잭션 ACID ACID의 사전적 정의보다는 ACID가 어떤 이유에서 나왔고 어떤 기술들이 ACID를 가능하게 하는지가 중요 사전적 정의 : 데이터베이스 트랜잭션(데이터에 대한 하나의 논리적 실행단계)이 안전하게 수행된다는 것을 보장하기 위한 성질을 가지키는 약어 Atomicity(원자성) : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력 원자적 연산을 보장해야 함 → All or Nothing (중간에 연산이 수행하다가 멈추지 않음) 어떻게 보장? MVCC를 통해 UPDATE가 일어나면 기존의 데이터에 900원을 더해주고 UPDATE 전의 데이터는 사라지는 것이 아닌 Undo Log에 저장 만약 트랜잭션이 실패하게 되면 Undo Log에 있는 데이터로 복원 Undo.. 2023. 6. 7.