[Transaction] 트랜잭션과 트랜잭션 격리성 공부하기

2023. 4. 11. 10:44몰랐던거/DB


트랜잭션이란?

트랜잭션은 DB의 상태 변화를 위해 수행되는 가장 작은 더 이상 쪼개질 수 없는 작업 단위입니다.

하나의 트랜잭션이 가진 작업들은 한 몸처럼 동작해야 하기 때문에 실패하면 전부 다 없던 작업으로 처리(RollBack)하고 성공하면 DB에 반영(Commit)합니다.

 

트랜잭션의 특성

트랜잭션은 아래의 4가지 특성을 가집니다.

  1. 원자성 (Atomicity) : 더 이상 쪼개지지 않는 최소 작업의 단위입니다.
  2. 일관성 (Consistency) : 일관된 DB에서 트랜잭션이 성공된 후에도 DB가 일관되어야 합니다. 트랜잭션의 결과로 DB가 모순되면 안됩니다. 
  3. 격리성 (Isolation) : 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없습니다.
  4. 영속성 (Durability) : 트랜잭션이 성공하면 그 결과가 DB에 영속적으로 저장되어야 합니다.

트랜잭션의 격리성

특성에서 격리성은 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다라고 했습니다.

하지만 무조건 접근할 수 없다가 아닌 트랜잭션의 접근 레벨에 따라 다르게 설정이 가능합니다. 격리성이 더 강하게도 더 약하게도 설정될 수 있습니다.

이런 트랜잭션 접근 레벨 설정에 따라서 너무 약하게 설정했을 때 발생하는 문제점들이 있습니다.

  1. Dirty Read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 문제. 
  2. Non-Repeatable Read : 하나의 트랜잭션에서 하나의 로우를 2번 읽었을 때 그 결과값이 다르게 나타나는 문제.
  3. Phantom Read : 하나의 트랜잭션에서 2번의 데이터 조회 시 이전 조회에서 존재하지 않던 로우가 나타나는 문제.

트랜잭션 접근 레벨

트랜잭션의 접근 레벨에 따른 설정 범위와 발생할 수 있는 문제를 알아보겠습니다.

  1. Read Uncommitted (Level 0) : 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 수 있는 레벨입니다. 발생할 수 있는 문제는 Dirty Read, Non-Repeatable Read, Phantom Read가 있고 이는 정합성에 문제가 발생할 수 있기 때문에 권장하지 않습니다.
  2. Read Committed (Level 1) : 트랜잭션에서 커밋된 데이터를 읽을 수 있는 레벨입니다. 커밋되지 않은 데이터는 Undo 로그에 있는 이전 데이터를 읽어오고 그래서 Non-Repeatable Read와 Phantom Read 문제가 발생할 수 있습니다.
  3. Repeatable Read (Level 2) : 트랜잭션 내의 삭제, 변경에 대해서 Undo 로그에 넣고 앞서 발생한 트랜잭션에 대해선 Undo 로그를 읽게 합니다. 트랜잭션 내에서의 값의 변경에 대해서 일정한 값으로 처리할 수 있습니다. 하지만 Phantom Read는 발생할 수 있습니다.
  4. Serializable Read (Level 3) : 트랜잭션 내에서 쿼리를 두 번 이상 수행 시 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지 않도록 하는 설정입니다.

※ 이런 트랜잭션 격리성을 너무 세게 잡는다면 성능적으로 안좋을 수 있지만 안정성이 올라가고 약하게 잡는다면 데이터의 일관성과 격리성이 떨어지게 되는 트레이드 오프가 있기에 잘 생각해서 사용해야합니다.


마무리

트랜잭션에 대해서 공부해봤습니다. 프로젝트를 진행하면서 트랜잭션을 많이 사용을 했는데 그 때마다 제대로 알지 못하고 썼던거 같습니다. 이번 기회에 개념을 잡을 수 있어서 좋았습니다.

 

Reference

https://sewonzzang.tistory.com/75

 

[database] 트랜잭션(transaction)과 격리성(Isolation)

트랜잭션(Transaction) 트랜잭션은 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻합니다. 여러개의 테이블에 차례대로 데이터를 insert를 한다고 가정합니다. 테이블이 쪼개

sewonzzang.tistory.com

 

'몰랐던거 > DB' 카테고리의 다른 글

[Lock] DB 락에 대해서 공부하기  (0) 2023.04.11
인덱스 (index)  (0) 2022.11.30
DBMS의 종류, DB 서버  (0) 2022.08.31
데이터베이스의 개념  (0) 2022.08.31
DDL, DML, DCL 이란?  (0) 2022.08.25