티스토리 뷰

728x90

3개월 전 모기업에 인턴을 지원하게 되었는데 운이 좋아 최종 면접까지 봤습니다. 준비가 정말 부족하다는 느낌을 많이 받았고 back-end 개발자 db관련 면접 질문을 조금이라도 보고 갔다면 좋았을걸..... 알아야 할게 많지만 제가 느끼기에 중요한  트랜잭션과 Isolation Level에 대해 정리를 해보겠습니다.

 

트랜잭션이란? 위키 백과에는 다음과 같이 나와있다.

정리 

database의 데이터를 조작하는 작업의 단위

사용자는 트랜잭션을 통해 데이터베이스에 안정성과 신뢰성을 얻을 수 있다.

명령을(연산) 끝 마칠 때까지 수행 내역을 로그에 저장 (redo, udno log)

 

❗ ACID

Atomicity(원자성) : 트랜잭션의 연산은 데이터 베이스에 모두 반영되던지 중 하나이다.

Rollback : 1~4번까지 작업이 있는데 수행 중에 3번이 실패했다면 1,2번을 없던 일로 되돌려야 한다.

Commit : 1~4번까지 작업이 있을 때 모두 성공적으로 완료되면 수정된 내용을 DB에 반영

 

Consistency(일관성) : 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 DB상태로 변환된다트리거를 통해 일괄 적으로 모DB에 적용

Trigger : 데이터 조작 언어(DML)의 데이터 상태의 관리를 자동화하는 데 사용된다.

 

Isolation(격리성) : 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.

 

Durability(지속성) : 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도.  Redo, undo 연산을 통해 데이터베이스를  복구 시킴

Redo(재실행) log: 가장 최근에 저장한 DB 복사본을 가져온 후 로그를 DB에 재반영

Undo(취소) log : 수행을 실패해 이전의 상태로 되돌린다.

 

❔ Transaction Isolation Level

한 트랜잭션이 다른 트랜잭션에서 변경한 데이터를 볼 수 있도록 해줄지 말지를 결정하는 것이다.

 

격리 수준은 왜 생겼을까?

 

1. Dirty Read  ((오손 데이터 읽기)

한 트랜잭션(T1)이 데이터 A에 접근해서 B로 변경했는데 커밋을 하지 않았다. T2A에 접근하면 B라는 결과를 받는다 T1커밋을 하지 않고 종료하게 된다면 T2가 가진 데이터가 꼬이는 문제가 발생한다.

 

2. Non-Repeatable Read (반복 불가능 데이터 읽기)

T1이 데이터를 ReadRead 하고 있다 이때 T2가 데이터에 접근해서 삭제(변경)하고 커밋을 진행할 경우 T1은 다시 데이터를 Read할 때 사라진 데이터를 찾게 된다.

 

3. Phantom Read (유령 데이터)

T1 조건을 걸어 데이터를 검색해서 결과를 얻었는데 T2가 접근해 해당 조건의 데이터 일부를 삭제 추가 연산을 했을 때 ,, 아직 끝나지 않은 T1이 다시 한번 해당 조건으로 데이터를 조회하면 변경된 데이터가 누락된다. 없던 일처럼 rollback을 진행하면 데이터가 꼬이는 문제가 생김.

 

이러한 세 가지의 문제점 때문에 격리 수준이 생겼습니다. Level 별로 정리를 하자면

 

LEVEL 1 Read Uncommitted

한 트랜잭션에서 커밋하지 않은 데이터에 다른 트랜잭션이 접근 가능하다.

즉, 커밋하지 않은 데이터를 읽을 수 있다.

모든 문제점이 발생할 수 있지만 동시 처리 성능이 가장 높다.

발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read


LEVEL 2 Read Committed

커밋이 완료된 데이터만 읽을 수 있다.

Read Uncommitted 수준보다 동시 처리  성능은 떨어진다데이베이스들은 Read Committed를 디폴트 수준으로 지정한다.

발생 문제점 Non-Repeatable Read, Phantom Read

 

LEVEL  3 Repeatable Read

트랜잭션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회 

발생 문제점 : Phantom Read


LEVEL  4 Serializable

가장 엄격한 격리 수준

모든 문제점을 해결 가능하지만 그 대신 동시 처리 성능은 급격히 떨어질 수 있다.

 

표 정리 

내 생각

이걸 사용하는 이유는 여러 스레드에서 하나의 자원에 접근할 때 접근권한(보게 할지 말지)을 적절한 격리 수준을 활용하지 않으면 예상치 못한 버그가 생길 수 있고 위에 언급했던 세 가지 정합성 문제가 일어날 수 있어서 사용하는 것 같다.

어쨌든 격리 수준을 쓰는 이유는 동시성 문제를 해결하기 위함인데 격리 수준을 사용하는 데에 있어 데이터 처리에 맞게 어떤 Isolation Level을 사용할 건지가 중요한 것 같다. Serializable 격리 수준을 사용하여 모든 문제점을 해결할 수는 있지만 이게 Level 4라고 무조건 좋은 거 같지는 않다.

 

 

 

댓글
최근에 달린 댓글
최근에 올라온 글
Total
Today
Yesterday
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31