유당불내증이 있는 개발자 2023. 10. 21. 12:59

트랜잭션이란?

트랜잭션은 데이터베이스에서 하나의 기능을 수행하기 위한 작업의 단위이다.

데이터베이스에 접근 하는 방법은 쿼리이므로 여러개의 쿼리들을 하나로 묶는 단위라고 말할 수 있다.

 

트랜잭션의 특징으로는

원자성,일관성,독립성,지속성 ACID라고 하는 4가지가 있다.

 

[ Atomicity - 원자성 ]

 작업이 모두 반영되거나 모두 반영되지 않아야 한다. all or nothing 이라는 말이 있다.

 

[ Consistency - 일관성 ]

데이터베이스의 제약이나 규칙을 만족해야 한다

 

[ Isolation - 독립성 ]

트랜잭션을 수행 시 다른 트랜잭션이 영향을 주거나 받아서는 안된다

 

[ Durability - 지속성 

트랜잭션이 성공적으로 수행되었다면, 영원히 반영되어야 한다

 

 

여기서 독립성이 중요한 포인트라고 생각한다. 독립성의 격리수준이라고도 하는데 4가지 단계가 있다.

**DB 아이솔레이션 레벨**

데이터베이스마다 레벨이 다르다.

  - Oracle: READ_COMMITTED

  - MySQL: REPEATABLE_READ

 

-리드언커밋

커밋되기 이전 데이터 읽어옴 / 10만원에서 15만원 변경 후 커밋되기 전 15만원 데이터 읽어오는 문제 , 커밋되기전 롤백 될 수도 있음

더티 리드 문제 발생: 데이터를 변경했지만 아직 커밋되지 않았을 때 다른 트랜잭션이 해당 값을 조회할 수 있는 문제

 

- 리드커밋 

커밋된 데이터만 읽을 수 있다. 10만원 -> 15만원 변경 ,

중간에 조회시 데이터는 10만원을 읽어옴 , 커밋 후 다시 조회하면 15만원이 조회되는 문제가 있다.

논 리피터블 리드  문제 발생 : 트랜잭션 내에서 같은 데이터를 여러번 조회할 때 읽은 데이터가 서로 다른 값으로 나오는 문제 

 

- 리피터블 리드 

특정 데이터 조회 시 같은 값 반환: 10 -> 15만 , 데이터는 10만을 읽어옴 , 15만 커밋 후 다시 조회하면 10만 조회되는 문제

특정 행을 조회시 항상 같은 데이터를 응답하는 것을 보장하는 격리 수준이다. 하지만, SERIALIZABLE과 다르게 행이 추가되는 것을 막지는 않는다. 이로 인해 팬텀 리드 현상이 발생할 수 있다. 조회해온 결과의 행이 새로 생기거나 없어지는 현상이다.

 

팬텀리드 문제 발생 : 다른 트랜잭션이 커밋(Commit)한 데이터가 있더라도 자신의 트랜잭션에서 읽었던 내용만 사용하는 것을 의미한다.

즉, 한 트랜잭션에서 같은 쿼리를 2번이상 조회했을 때 없던 결과가 조회되는 상황

 

- SERIALIZABLE

가장 엄격한 격리 수준으로, 이름 그대로 트랜잭션을 순차적으로 진행시킨다. 

여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않는다. 하지만 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다

 

 

한줄요약

리드언커밋

- 트랜잭션 1이 커밋하지 않은 데이터에 대해, 트랜잭션 2가 읽는 것을 허용

 

리드커밋

- 트랜잭션 1이 커밋한 데이터에 대해, 트랜잭션 2가 읽는 것을 허용

 

리피터블리드

- 트랜잭션 1이 읽은 데이터에 대해, 트랜잭션 1이 종료될 때까지, 다른 트랜잭션에서 수정/삭제 허용하지 않음

    - 다른 트랜잭션에서 삽입은 허용

 

시리얼라이제이블

- 트랜잭션 1이 읽은 데이터에 대해, 트랜잭션 1이 종료될 때까지, 다른 트랜잭션에서 수정/삭제/삽입 허용하지 않음