CS/DB

[DB]Transaction

빈둥벤둥 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 스프링