주제목차내용트랜잭션 격리 레벨1. 트랜잭션이란 ?🤔 부정합 ?1.1 트랜잭션의 특징 ACID2. 트랜잭션 격리 수준🤔 ANSI (American National Standards Institue)2.1 READ UNCOMMITTED (권장x)2.2 READ COMMITTED (ORACLE)2.3 REPEATABLE READ (MY SQL)2.4 SERIALIZE3. 부정합의 종류3.1 Dirty Read3.2 Non-Repeatable Read3.3 Phantom Read참조
주제
트랜잭션 격리 레벨 알아보기
목차
- 격리수준 들어가기 전 트랜잭션이 무엇이고 트랜잭션의 특징 4가지 정말 간략히 정리하기 (격리수준에 대해 알아보는 스터디 이기 때문에)
- 그래서 트랜잭션의 격리수준이란 무엇일까?
- 왜 알아야 할까? or 왜 필요할까?
- 격리수준 4가지 어떤게 있을까?
- 부정합 문제 3가지 어떤게 있을까?
- 각 격리 수준에서 발행할 수 있는 부정합 문제는 어떤게 있을까?
격리수준과 부정합에 대한 내용은 그림과 함께 이해하기 쉽도록 더 힘을 줘서 준비하기 !
내용
트랜잭션 격리 레벨
1. 트랜잭션이란 ?

- 하나 이상의 SQL 문을 포함하는 논리적이고 원자적인 작업단위
- 트랜잭션은 SQL문을 그룹화하여 모두 커밋되어 DB에 적용되거나 모두 롤백되어 DB에서 실행 취소되도록 함
- 데이터의 부정합 방지의 목적 !
🤔 부정합 ?
- 데이터가 연결되어있는 메모리 상에서 변경이 되는 경우 관련된 데이터들이 일괄적으로 값이 일치화 시키는 과정에서 데이터의 값이 다른 경우
1.1 트랜잭션의 특징 ACID
- 원자성 (Atomicity)
- 트랙잭션의 모든 작업이 수행되거나 수행되지 않는다.
=>
There are no partial transactions.
- EX) 100개의 row를 update했는데 20개를 업데이트하고 실패할 경우 20개를 롤백함
- 일관성 (Consistency)
- 트랜잭션은 DB를 일관된 상태에서 다른 일관된 상태로 가져온다. => 트랜잭션이 완료된 상태에서도 트랜잭션 이전의 상황과 동일하게 데이터는 일관성 있어야한다.
- EX) 입출금 거래 실패로 인해 DB가 계좌에 입금만 하게되어 일관성 없는 데이터가 발생하면 안 된다.
- 독립성 (Isolation)
- 트랜잭션의 결과는 커밋될 때까지 다른 트랜잭션에 표시되지 않는다. => 다른 트랜잭션에 독립적으로 수행되어야한다.
- EX) 테이블을 업데이트하는 한 사용자는 다른 사용자가 동시에 수행한 커밋되지 않은 변경 사항을 보지 못해서, 트랜잭션이 연속적으로 실행되는 것처럼 사용자에게 나타난다.
- 영구성 (Durability)
- 커밋된 트랜잭션에 의한 변경 사항은 영구적이다.
- 시스템 장애가 발생해도 트랜잭션의 변경사항이 손실되지 않도록 해야한다.
2. 트랜잭션 격리 수준

- ACID 원칙을 엄격하게 지키려면 **동시성이 매우 떨어진다. **
- *독립성 원칙을 지키는 정도를 제어하여 동시성을 얻을 수 있다. **
- Locking이라는 개념을 사용한다.
- ANSI 표준에서 설명하는 네 가지 트랜잭션 격리 수준
READ COMMITTED
,REPEATABLE READ
READ UNCOMMITTED
,SERIALIZABLE
🤔 ANSI (American National Standards Institue)
- 미국 국립 표준 협회로 미국의 산업 표준을 제정하는 민간단체
- 국제표준화기구 ISO (International Organization for Standardization)에 가입되어있다.
- ASCII
2.1 READ UNCOMMITTED (권장x)

- COMMIT 되지 않은 데이터에 다른 트랜잭션이 접근할 수 있다.
- 정합성에 심각한 문제가 발생할 수 있다.
- LOCK이 발생하지 않는다.
- 부정합은 Dirty Read, Non-Repeatable Read, Phantom Read 가 있다.
2.2 READ COMMITTED (ORACLE)

- COMMIT 된 데이터에 다른 트랜잭션에서 접근할 수 있다.
- SELECT 수행 마다 스냅샷을 다시 뜬다.
- 부정합은 Non-Repeatable Read, Phantom Read 가 있다.
2.3 REPEATABLE READ (MY SQL)

- 처음 SELECT 수행한 스냅샷을 남긴다.
- 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.
- 자신보다 낮은 트랜잭션 번호에서 커밋한 것만 볼 수 있다.
- 부정합은 Phantom Read 가 있다.
2.4 SERIALIZE
- 가장 강력하다.
- 트랜잭션이 끝날 때까지 사용 중인 데이터에 접근할 수 없다.
- 동시성은 매우 떨어지지만 무결성은 높아진다.
3. 부정합의 종류
3.1 Dirty Read

- READ UNCOMMITTED 격리 수준에서 나타날 수 있는 현상
- 트랜잭션의 커밋 이전의 변경된 데이터를 보고 있을 때, 해당 트랜잭션이 ROLLBACK 된다면 현재 보고있는 데이터가 잘못된 데이터가 되는 경우
3.2 Non-Repeatable Read

- B가 트랜잭션을 시작하고 emp_no = 1를 검색했을 때 신짱구가 조회됩니다.
- 이후 A가 트랜잭션을 시작하고 신짱구 이름을 훈이로 update하고 commit을 날린 후 B가 또 select를 합니다.
- 이때 검색 결과가 신짱구가 아닌 수정된 훈이가 나옵니다.
- 한 트랜잭션 내에서 같은 쿼리를 두번 수행할 때, 다른 트랜잭션이 값을 수정함으로써 두 쿼리가 상이하게 나타나는 비 일관성이 발생하는 것
3.3 Phantom Read

- B가 트랜잭션을 시작하고 직원 테이블을 검색했을 때 신짱구가 조회됩니다.
- 이후 A가 트랜잭션을 시작하고 맹구를 insert 하고 commit을 했습니다.
- B가 똑같이 검색을 하면 {신짱구, 맹구} 가 조회됩니다.
- 이 처럼 한 트랜잭션 내에서 반복 조회 시 결과 집합이 달라지는 것 입니다.
- * INSERT**에 대해서만 발생하는 문제로 쓰기 잠금을 걸어야한다.