SQL

트랜잭션

peach_h 2022. 10. 9. 20:41
트랜잭션이란?

데이터베이스 관리 시스템에서 상호작용의 단위 / 어떤 요청이 끝난 상태

데이터베이스 기능 중 가장 큰 기능 임.

쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다.

 

 

트랜잭션의 4대 특징 ACID

1. 원자성(Atomicity) : 무조건 전부 성공하거나, 전부 실패해야함

     COMMIT : 처리 확정

     ROLLBACK : 문제 발생 시 첫 과정 직전 상태로 복귀

2. 일관성(Consistency) : 데이터 조작 전후에 일관성 유지 필요

3. 고립성(Isolation) : 여러 사용자가 동시에 데이터 조작을 실행할 경우 각 처리가 모순 없이 실행되어야함.

4. 지속성(Durability) : 한번 데이터가 변하면 그 상태를 유지하는 것. 

    트랜잭션이 Commit 되고 나면, 데이터 변동 사항이 영구적으로 확정되어야함.

 

트랜잭션 고립성의 중요성

사용자 A와 B가 영화를 예매할 때, A가 선택한 좌석을 취소할 때 까지 다른 사용자가 선택할 수 없어야함.

 

 

 

트랜잭션 격리 수준
ANSI 표준 격리 수준

1. Read Uncommitted : 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용

     성능과 동시성은 좋지만, 데이터 정확성이 떨어진다.

2. Read Committed : 트랜잭션이 Commit이 확정된 데이터만 다른 트랜잭션이 읽도록 허용 (Oracle)

3. Repeatable Read : 반복 읽기

    쿼리를 2번이상 수행할 때, 첫 번째 쿼리의 레코드가 바뀌거나 사라지는 것을 방지.

    ex ) A가 트랜잭션 처리를 마칠 때 까지 B가 접근하지 못하게 lock을 잡고있다.

4. Serializable : 직렬화 가능

    쿼리를 2번이상 수행할 때, 첫 번째 쿼리의 레코드가 바뀌거나 사라지는것 + 새로 추가도 안됨

    누군가 작업 중일 때, 데이터를 새로 넣지도 못하게함.

 

가장 이상적인 격리 수준은 Serializable임

but) 동시성이 크게 떨어져 성능도 안좋아짐. 그래서 Serializable은 잘 사용하지 않는다.

 

 

격리 수준이 완화되면서 직렬화 가능에서는 없었던 현상들이 발생함

1. Dirty Read : Dirty 읽기

어떤 트랜잭션이 Commit 되기 전 다른 트랜잭션에서 데이터를 읽어버림.

변경 된 트랜잭션이 최종 롤백 된다면? 그 값을 읽은 트랜잭션은 비 일관된 상태에 놓이게된다.

 

2. Non-Repeatable Read : 애매한 읽기 /  이전에 읽은게 달라져서나옴

A가 읽는 중에 B가 데이터를 수정해버리면, A가 다시 읽었을 때 데이터가 변해버림

같은 쿼리를 2번 수행했는데, 그 사이에 값이 수정되는 바람에 두 쿼리 결과가 다르게 나와버리는 현상

 

3. Phantom Read : 유령 읽기 / 데이터가 나타나거나 사라짐

같은 쿼리를 2번 수행했는데, 그사이 없었던 데이터가 추가되어 유령(Phantom) 레코드가 두번째 쿼리에 등장

 

격리 수준과 현상 발생 가능 여부
격리 수준 Dirty Read Non-Repeatable Read Phantom Read
Read Uncimmutted O O O
Read Committed X O O
Repeatable Read X X O
Serializable X X X

 

 

 

LOCK : 트랜잭션 데이터를 수정 중이라는 사실을 알리는 방법의 잠금 장치

A가 데이터를 사용하고 있을 때, B가 접근하지 못하게 함.

데이터베이스는 동시성을 제공하면서 일관성을 제공하기 때문에 LOCK이 필수적이다.

 

공유락 : A가 공유락을 걸면, B는 READ는 가능하다.

배타락 : A가 배타락을 걸면, B는 READ도 못함.

 

데드락 : A가 1번 데이터에 락을 걸고, 2번 데이터에 대기중 / B가 2번 데이터에 락을 걸고, 1번 데이터에 대기중

무한대기에 빠져버리는 상황을 데드락 이라고함.

-> 이럴 때 DBMS는 작업 중 하나를 강제로 중지시켜서 해결함.

 

 

자제해야하는 트랜잭션

1. Auto Commit : Commit 과부하 유발

2. 긴 트랜잭션 : 대량 처리를 한개의 트랜잭션이 실행하는 것을 피해야함.

3. 시스템과 어플리케이션 로직에 맞는 트랜잭션 격리 수준을 조정해야함.

 

'SQL' 카테고리의 다른 글

테이블 설계  (1) 2022.10.09
DA# 데이터 모델링 실습  (0) 2022.10.09
연습문제풀이  (0) 2022.10.05
서브 쿼리  (0) 2022.10.05
VIEW  (0) 2022.10.05