-
[DB]TransactionCS/DB 2021. 7. 11. 20:25
📝 Transaction
✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨
📌 Transaction
🔎 트랜잭션에 대해 알아보자.
- 여러 쿼리를 논리적으로 하나의 작업으로 묶어주는 것이다.
- 관련 용어를 알아보자.
- commit: 트랜잭션으로 묶인 모든 쿼리가 성공하여 트랜잭션 연산 결과를 DB에 반영한다.
- rollback: 쿼리 실행 결과를 취소하고 DB의 상태를 트랜잭션 이전 상태로 되돌린다.
📌 Transaction의 성질
🔎 트랜잭션의 성질을 알아보자.
- 트랜잭션이 안전하게 수행된다는 것을 보장한다. 다음과 같은 성질을 가진다. (ACID 성질)
- Atomicitiy(원자성): 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 한다.
- Consistency(일관성): 트랜잭션 작업처리결과는 항상 일관성 있어야 한다. DB는 항상 일관된 상태로 유지되어야 한다.
- Isolation(독립성): 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
- Durability(지속성): 트랜잭션이 성공적으로 완료되었으면 결과는 영구적으로 반영되어야 한다.
🔎 ACID 성질은 항상 지켜져야 할까?
- ACID는 이론적은 보장해야할 성질이다. 실제로는 성능을 위해 성질 보장이 완화되기도 한다.
📌 Transaction 격리 수준
🔎 격리 수준에 대해 알아보자.
🙋♀️ 여러 트랜잭션이 동시에 DB에 접근할 때 그 접근을 제어하기 위해 격리 수준을 설정할 수 있다.
- 다음과 같은 단계로 나눌 수 있으며 아래로 갈수록 동시성은 떨어지지만, 데이터 정합성은 높아진다.
- READ-UNCOMMITTED
- READ-COMMITTED
- REPEATABLE-READ
- SERIALIZABLE
🔎 READ-UNCOMMITTED
- 커밋되기 이전의 트랜잭션의 데이터 변경 내용을 다른 트랜젝션에서 읽는 것을 허용한다.
- 트랜잭션 A가 10번 사원의 나이를 27살에서 28살로 변경후 아직 commit하지 않았다.
- 동시에 실행되고 있는 트랜젝션 B에서 10번사원의 나이를 조회하면 28살로 조회된다. (dirty read)
- 트랜잭션 A가 rollback 한다.
- 트랜잭션 B는 10번 사원이 여전히 28살이라고 생각하고 로직을 수행한다.
- Dirty read, Non repeatable read, Phantom read 가 발생한다.
🔎 READ-COMMITTED
- 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회가 가능하다.
- 트랜잭션 B가 10번 사원의 나이를 조회하면 27살로 조회된다.
- 트랜잭션 A가 10번 사원의 나이를 27살에서 28살로 변경후 commit한다.
- 트랜잭션 B가 다시 10번사원의 나이를 조회하면 28살로 조회된다. (non repeatable read)
- Non repeatable read, Phantom read 가 발생한다.
🔎 REPEATABLE-READ
🙋♀️ MYSQL) 트랜잭션 마다 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션에서 변경한 내용만 조회한다.
- 트랜잭션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회된다.
- 트랜잭션 A를 시작하고 10번 사원의 나이를 조회하면 27살로 조회된다.
- 트랜잭션 B를 시작하고 10번 사원의 나이를 27살에서 28살로 변경한다.
- 트랜잭션 A가 10번 사원의 나이를 조회하면 27살로 조회된다. (트랜잭션 B의 ID가 더 작다.)
- 트랜잭션 B가 11번 사원의 정보를 insert한다.
- 트랜잭션 A가 모든 사원의 정보를 조회하면 10, 11번 사원이 조회된다. (phantom read)
- Phantom read 가 발생한다.
🔎 SERIALIZABLE
- 가장 높은 격리수준으로 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.
- 동시 처리 성능이 가장 떨어지지만 정합성 문제가 전혀 발생하지 않는다.
🔎 격리성 관련하여 발생할 수 있는 정합성 문제에 대해 알아보자.
- Dirty read
- commit되지 않은 변경사항을 읽는다.
- Non repeatable read
- 같은 트랜잭션 내에서 같은 값을 조회할 때 다른 값이 조회된다.
- Phantom read
- 없던 데이터가 생기거나, 있던 데이터가 사라지는 것을 말한다.
- update에 대해서는 정합성을 보장하지만, insert/delete에 대해선 보장하지 않기 때문에 발생한다.
📌 Transaction 전파 타입
🔎 트랜잭션 전파타입이란 무엇일까
- 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다.
🔎 트랜잭션 전파 타입 in 스프링
'CS > DB' 카테고리의 다른 글
DB - RDBMS (0) 2021.03.01 DB - Transaction (0) 2021.02.14 DB - Index (0) 2021.02.14 DB - KEY (0) 2021.02.12 DB - 파티셔닝과 샤딩 (0) 2021.02.12