✔️ 트랜잭션
트랜잭션이란?
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
- 사용자의 입장에서는 작업의 논리적 단위
시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위 - 트랜잭션은 특징으로 ACID(원자성, 일관성, 독립성, 지속성)을 가짐
- 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 함
- 일관성(Consistency) : 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 함
- 독립성(Isolation) : 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없음
- 지속성(Durability) : 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 함
트랜잭션 상태

- 트랜잭션의 상태로는 Active, Failed, Partially Committed, Committed, Aborted가 존재
- Active : 트랜잭션 활동 상태 (트랜잭션이 실행 중이며 동작 중인 상태)
- Failed : 트랜잭션 실패 상태 (트랜잭션이 더 이상 정상적으로 진행할 수 없는 상태)
- Partially Commited : 트랜잭션의 Commit 명령이 도착한 상태 (SQL문이 수행되고 Commit만 남은 상태)
- Committed : 트랜잭션 완료 상태 (트랜잭션이 정상적으로 완료된 상태)
- Aborted : 트랜잭션 취소 상태 (트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태)

- 하나의 트랜잭션이 성공적으로 끝난 후 DB가 일관성 있는 상태일 때 이를 알려주기 위해 Commit을 하여 반영
- Commit 요청이 들어오면 상태는 Partially Committed 상태가 되고
이후 Commit을 문제없이 수행할 수 있으면 Committed 상태로 전이되고
만약 오류가 발생하면 Failed 상태가 됨 - 이미 Commit한 트랜잭션의 수정을 재반영하는 복구 작업으로는 REDO를 하게 됨
- Commit 요청이 들어오면 상태는 Partially Committed 상태가 되고
- 하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우 Rollback을 통해 이전 상태로 돌아갈 수 있음
- 이때 정상적으로 종료되지 않은 트랜잭션이 변경한 페이지들을 원상 복구 시키기 위해 UNDO를 하게 됨
트랜잭션 격리 수준
- 트랜잭션에 일관성 없는 데이터를 허용하는 수준
- 데이터베이스는 Locking(잠금)을 통해 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 동시성을 제어함
하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면
데이터베이스의 성능은 떨어지게 됨
그렇다고 해서, 성능을 높이기 위해 Locking의 범위를 줄인다면 잘못된 값이 처리될 수 있으므로
최대한 효율적인 Locking 방법이 필요함 - 트랜잭션 격리 수준으로는 레벨 0, 1, 2, 3이 존재
- Read Uncommited (레벨 0) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
트랜잭션에 처리 중이거나, 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
이로 인해 데이터베이스의 일관성을 유지하는 것이 불가능 - Read Committed (레벨 1) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 수행되는 동안 다른 트랜잭션 트랜잭션이 접근할 수 없어 대기하게 되며
Commit이 이루어진 트랜잭션만 조회 가능 - Repeatable Read (레벨 2) : 트랜잭션 완료까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
하지만 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대해 수정이 불가능 - Serializable (레벨 3) : 트랜잭션 완료까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
완벽한 일관성 모드를 제공하지만 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력이 불가능
- Read Uncommited (레벨 0) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
- 트랜잭션 격리 수준에 대한 조정은 동시성과 데이터 무결성에 연관되어 있음
동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 됨
또한 레벨을 높게 조정할수록 발생하는 비용이 증가함 - 이로 인해 낮은 단계의 트랜잭션 격리 수준을 활용할수록 많은 현상들이 발생함
- Dirty Read
어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게 됨 - Non-Repeatable Read
한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서
두 쿼리의 결과가 상이하게 나타남 - Phantom Read
한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때,
트랜잭션 도중 새로운 레코드 삽입이 허용되어 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상
- Dirty Read

'Tech Interview > Database' 카테고리의 다른 글
[Database] 목차 (0) | 2024.01.10 |
---|---|
[Database] SQL vs NoSQL (0) | 2024.01.10 |
[Database] 정규화 (0) | 2024.01.03 |
[Database] 이상 (0) | 2024.01.02 |
[Database] 인덱스 (0) | 2023.12.30 |
✔️ 트랜잭션
트랜잭션이란?
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
- 사용자의 입장에서는 작업의 논리적 단위
시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위 - 트랜잭션은 특징으로 ACID(원자성, 일관성, 독립성, 지속성)을 가짐
- 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 함
- 일관성(Consistency) : 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 함
- 독립성(Isolation) : 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없음
- 지속성(Durability) : 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 함
트랜잭션 상태

- 트랜잭션의 상태로는 Active, Failed, Partially Committed, Committed, Aborted가 존재
- Active : 트랜잭션 활동 상태 (트랜잭션이 실행 중이며 동작 중인 상태)
- Failed : 트랜잭션 실패 상태 (트랜잭션이 더 이상 정상적으로 진행할 수 없는 상태)
- Partially Commited : 트랜잭션의 Commit 명령이 도착한 상태 (SQL문이 수행되고 Commit만 남은 상태)
- Committed : 트랜잭션 완료 상태 (트랜잭션이 정상적으로 완료된 상태)
- Aborted : 트랜잭션 취소 상태 (트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태)

- 하나의 트랜잭션이 성공적으로 끝난 후 DB가 일관성 있는 상태일 때 이를 알려주기 위해 Commit을 하여 반영
- Commit 요청이 들어오면 상태는 Partially Committed 상태가 되고
이후 Commit을 문제없이 수행할 수 있으면 Committed 상태로 전이되고
만약 오류가 발생하면 Failed 상태가 됨 - 이미 Commit한 트랜잭션의 수정을 재반영하는 복구 작업으로는 REDO를 하게 됨
- Commit 요청이 들어오면 상태는 Partially Committed 상태가 되고
- 하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우 Rollback을 통해 이전 상태로 돌아갈 수 있음
- 이때 정상적으로 종료되지 않은 트랜잭션이 변경한 페이지들을 원상 복구 시키기 위해 UNDO를 하게 됨
트랜잭션 격리 수준
- 트랜잭션에 일관성 없는 데이터를 허용하는 수준
- 데이터베이스는 Locking(잠금)을 통해 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 동시성을 제어함
하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면
데이터베이스의 성능은 떨어지게 됨
그렇다고 해서, 성능을 높이기 위해 Locking의 범위를 줄인다면 잘못된 값이 처리될 수 있으므로
최대한 효율적인 Locking 방법이 필요함 - 트랜잭션 격리 수준으로는 레벨 0, 1, 2, 3이 존재
- Read Uncommited (레벨 0) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
트랜잭션에 처리 중이거나, 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
이로 인해 데이터베이스의 일관성을 유지하는 것이 불가능 - Read Committed (레벨 1) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 수행되는 동안 다른 트랜잭션 트랜잭션이 접근할 수 없어 대기하게 되며
Commit이 이루어진 트랜잭션만 조회 가능 - Repeatable Read (레벨 2) : 트랜잭션 완료까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
하지만 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대해 수정이 불가능 - Serializable (레벨 3) : 트랜잭션 완료까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
완벽한 일관성 모드를 제공하지만 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력이 불가능
- Read Uncommited (레벨 0) : SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
- 트랜잭션 격리 수준에 대한 조정은 동시성과 데이터 무결성에 연관되어 있음
동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 됨
또한 레벨을 높게 조정할수록 발생하는 비용이 증가함 - 이로 인해 낮은 단계의 트랜잭션 격리 수준을 활용할수록 많은 현상들이 발생함
- Dirty Read
어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게 됨 - Non-Repeatable Read
한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서
두 쿼리의 결과가 상이하게 나타남 - Phantom Read
한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때,
트랜잭션 도중 새로운 레코드 삽입이 허용되어 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상
- Dirty Read

'Tech Interview > Database' 카테고리의 다른 글
[Database] 목차 (0) | 2024.01.10 |
---|---|
[Database] SQL vs NoSQL (0) | 2024.01.10 |
[Database] 정규화 (0) | 2024.01.03 |
[Database] 이상 (0) | 2024.01.02 |
[Database] 인덱스 (0) | 2023.12.30 |