트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적 단위
※ 어떤 블로그에서는 DML문 자체를 트랜잭션으로 보고 있는데 맞는건가?
→ DML문은 데이터베이스 자체에서 COMMIT을 하기 전에는 데이터 베이스에 반영된 게 아니지 않나...
DCL아닌가? 우선 패쓰..


1. 원자성(Atomicity)
완전한 상태를 의미한다. 삭제되거나 수행되거나 둘 중에 하나로 데이터를 보호한다.
2. 일관성(Consistency)
특정 제약 조건을 만족하는 데이터가 트랜잭션 후에도 여전히 그 조건을 만족해야 한다.
3. 격리(Isolation)
여러 사용자가 같은 테이블에서 모두 동시에 읽고 쓰기 작업을 할 때, 각각의 트랜잭션을 격리하면 동시
트랜잭션이 서로 방해하거나 영향을 미치지 않는다.
※ 꼬꼬무 : 이러면 DB데드락이 왜 생겨?
결론적으로 말하면 DBMS는 ACID를 기본적으로 지키면서 설계한다. 그러나 격리 수준에 따라서 개발자가
더 강하게 설정할 수 있다. 예를 들면 개발자가 DBMS가 제공하는 격리 수준을 설정하는 것이다.
기본적으로 DBMS는 보통 Read Committed가 기본 설정이다.
● Read Uncommitted : 가장 낮은 격리 수준이다. 데이터를 읽을 때, 다른 트랜잭션이 수정하고 있는 중인
데이터라도 읽을 수 있다. Dirty Read O, Non-repeatable Read O, Phantom Read O
→ INSERT, UPDATE, DELETE 도중에도 데이터를 읽을 수 있다.
● Read Committed : 데이터를 읽을 때, 커밋된 데이터만 읽을 수 있다. 다른 트랜잭션이 아직 커밋하지
않은 데이터는 읽을 수 없다. Dirty Read X, Non-repeatable Read O, Phantom Read O
→ 커밋된 데이터를 읽는데는 지장이 없다. 그러나 SELECT를 하는 중에 데이터가 변경되는데에는
책임지지 않는다.
● Repeatable Read : 데이터를 읽을 때, 읽은 데이터가 트랜잭션이 완료될 때까지 변경되지 않음이 된다.
따라서 같은 쿼리를 반복해서 실행해도 동일한 결과를 얻을 수 있다.
Dirty Read X, Non-repeatable Read X, Phantom Read O
→ 읽고 난 후에 변경이 되는 것이지 읽고 있는 중에 변경이 되는 일이 없다.
● Serializable : 가장 높은 격리 수준이다. 직렬화 가능 수준에서는 트랜잭션 간에 격리를 완전히 보장하기 위해 모든
읽기와 쓰기 작업이 직렬화된다. Dirty Read X, Non-repeatable Read X, Phantom Read X
→ 완전한 트랙잭션이 완료될 때까지 테이블이 절대 변하지 않는다.
결론
기본적인 DBMS는 Read Committed를 기반으로 격리성을 준수한다. 더 높은 격리성을 추구한다면
개발자가 설정할 수 있다. 그러나 격리 수준을 높인다는 것은 DBMS에 부담을 준다는 의미를 뜻하기도 하므로
적절하게 설정해서 사용하는 것이 중요하다.
[ Repeatable Read ] vs [ Serializable ] 보충
처음에는 어차피 Table을 읽을 때 변경되지 않으면 똑같은 격리수준이 아닌가 하고 찾아봤다.
그런데 단순히 SELECT를 통해서 읽는 상황은 똑같다. 그러나 예를 들어 프로시저나, 함수, 패키지의 경우를 통해서
읽는다고 생각하면 차이점을 알 수 있다.
Repeatable Read의 경우는 프로시저나 함수 내에서 참조해서 읽는 SELECT문만 끝나면 상관 없다.
Serializable의 경우는 프로시저나 함수 자체가 끝나야 변경이 가능하다는 의미이다.
4. 영속성(Durability)
트랜잭션 실행으로 인해 데이터에 적용된 변경 사항이 저장되도록 보장해야 한다.
'DB > 이론' 카테고리의 다른 글
| [ InfluxDB ] - Grafana (3) | 2024.07.23 |
|---|---|
| [ TSDB ] (0) | 2024.07.23 |
| PL/SQL 런타임 작동 방식 (0) | 2024.07.04 |
| Oracle - [ Date ] vs [ TIMESTAMP ] (0) | 2024.06.28 |
| SQL Injection - MyBatis (0) | 2024.06.24 |