Replies: 2 comments
1. 트랜잭션의 개념과 이를 보장하는 ACID 원칙에 대해 설명해주세요.트랜잭션은 데이터베이스 작업 시 여러 쿼리를 하나의 작업 단위로 묶어 무결성을 보장하는 기술입니다. 계좌 송금 예시처럼 작업 중간에 실패할 경우 전체를 취소(Rollback)하거나 모두 성공(Commit)시켜야 하는 데이터 일관성을 위해 필수적입니다. 2. 트랜잭션 격리 수준 4가지와 각 수준에서 발생하는 데이터 이상 현상을 설명해주세요.트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행될 떄, 서로의 변경 내용을 어느 정도까지 보이게 할지 정하는 기준입니다. 격리 수준이 낮으면 성능은 좋아질 수 있지만 데이터 이상 현상이 생길 가능성은 커집니다. 격리 수준이 높으면 데이터 정합성은 좋아지지만 동시성이 떨어질 수 있습니다.
정리)
|
1. 트랜잭션의 개념과 이를 보장하는 ACID 원칙에 대해 설명해주세요.트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 작업 단위를 의미한다. 즉, 여러 개의 SQL 연산이 하나의 작업을 구성한다면 이를 하나의 트랜잭션으로 묶어서 모두 성공하거나 모두 실패하도록 처리한다. 대표적인 예가 계좌 이체이다. 두 작업이 모두 성공해야 정상적인 계좌 이체가 된다. 만약 다음과 같이 된다면? A에서는 돈이 빠졌는데 B에는 돈이 들어오지 않는 문제가 발생한다. 따라서 두 작업을 하나의 트랜잭션으로 묶는다. 모든 작업이 성공하면: 중간에 오류가 발생하면:
트랜잭션은 안전하게 처리되기 위해 ACID라는 네 가지 특성을 가진다.
[ Atomictiy — 원자성 ] : 트랜잭션을 더 이상 나눌 수 없는 하나의 작업 단위로 취급하는 특성 All or Noting, 모든 작업이 성공하거나, 하나라도 실패하면 전체 작업을 취소해야 한다. 정상적인 경우에는 두 작업이 모두 반영된다. 하지만 B 계좌에 돈을 추가하는 과정에서 오류가 발생했다면: 따라서 부분적으로만 성공하는 상황을 방지한다. [ Consistency — 일관성 ] : 트랜잭션이 실행되기 전 데이터베이스가 정상적인 상태였다면, 트랜잭션이 완료된 후에도 정상적인 상태여야 한다는 원칙 여기서 정상적인 상태란 데이터베이스의 무결성 제약 조건이나 비즈니스 규칙 등을 만족하는 상태를 의미한다. 예를 들어: 이라는 제약이 있다고 생각해 보자. 트랜잭션 실행 후: 이 되어버린다면 데이터베이스의 규칙이 깨진다. 따라서 정상적인 트랜잭션이라면 이런 상태가 발생하지 않아야 한다. [ Isolation — 격리성 ] : 여러 트랜잭션이 동시에 실행되더라도 서로의 작업에 부적절하게 간섭하지 않도록 하는 특성 예를 들어 두 사용자가 동시에 같은 계좌를 조회하거나 수정할 수 있다고 하자. 이때 한 트랜잭션의 아직 확정되지 않은 변경사항을 다른 트랜잭션이 마음대로 읽거나, 도잇에 수정하면서 데이터가 꼬이면 문제가 발생한다. 그렇다고 모든 트랜잭션을 완벽하게 서로 격리하면: 처럼 사실상 순차 실행에 가까워진다. 그러면 동시성이 크게 떨어지게 되고, 그래서 데이터베이스는 Isolation Level(트랜잭션 격리 수준)을 제공한다. [ Durability — 지속성 ] : 트랜잭션이 성공적으로 COMMIT되었다면, 이후 시스템에 장애가 발생하더라도 그 결과가 사라지지 않아야 한다는 원칙 예를 들어: 서버가 다시 복구되었을 때 이체 결과가 사라지면 안 된다. 데이터베이스는 이를 위해 일반적으로 로그, WAL(Write-Ahead Logging), 복구(Recovery) 등의 매커니즘을 사용한다. 2. 트랜잭션 격리 수준 4가지와 각 수준에서 발생하는 데이터 이상 현상을 설명해주세요.격리 수준을 이해하려면 먼저 다음 세 가지 이상 현상을 알아야 한다.
[ Dirty Read ] : 아직 COMMIT되지 않은 다른 트랜잭션의 데이터를 읽는 현상 예를 들어: 이때 트랜잭션 B가: 그런데 A가: 한다면 실제 데이터는 다시: 즉 B는 실제로 확정되지 않은 데이터를 읽은 것이다. [ Non-Repeatable Read ] : 같은 트랜잭션에서 같은 행을 두 번 읽었는데 값이 달라지는 현상 예를 들어: 그 사이에 트랜잭션 B가: 그리고 다시 A가: 같은 트랜잭션에서 같은 데이터를 조회했는데: 으로 결과가 달라졌다. [ Phantom Read ] : 같은 조건으로 조회했는데 이전에는 없던 행이 새롭게 나타나거나 기존 행이 사라지는 현상 예를 들어: 첫 번째 조회: 그 사이에 다른 트랜잭션이: 그리고 다시 같은 쿼리를 실행한다. 결과: 기존 행의 값이 변경된 것이 아니라 조회 대상 집합 자체가 변한 것이다. [ READ UNCOMMITTED ] : 가장 낮은 격리 수준 다른 트랜잭션이 아직 COMMIT하지 않은 데이터도 읽을 수 있다. 따라서:
[ READ COMMITTED ] : COMMIT된 데이터만 읽는 수준 따라서 Dirty Read를 방지한다. 예를 들어 A가 데이터를 수정하고 아직 COMMIT하지 않았다면 B는 해당 변경사항을 읽지 못한다. 하지만 A가 데이터를 다시 읽는 사이 B가 값을 수정하고 COMMIT하면: 이 될 수 있다. 따라서 Non-Repeatable Read는 발생할 수 있다. 참고로 DBMS마다 기본 격리 수준이 다르다. 따라서 "모든 DB의 기본값이 READ COMMITTED"라고 외우면 안 된다. [ REPEATABLE READ ] : 한 트랜잭션에서 같은 행을 반복해서 읽어도 동일한 결과를 얻을 수 있도록 하는 수준 따라서: SQL 표준의 일반적인 설명에서는 Phantom Read가 발생할 수 있다. 다만 실제 Phantom Read 발생 여부는 DBMS의 구현 방식에 따라 달라질 수 있다. 특히 MVCC나 Lock을 사용하는 방식에 따라 실제 동작이 SQL 표준의 단순한 설명과 다를 수 있다. [ SERIALIZABLE ] : 가장 높은 격리 수준 트랜잭션들이 마치 순차적으로 실행된 것과 같은 결과를 얻도록 한다. 따라서 일반적인 세 가지 이상 현상을 모두 방지한다. 대신 동시성이 낮아진다. 트랜잭션 간 Lock 경합이나 대기 등이 증가할 수 있기 때문이다. |
Uh oh!
There was an error while loading. Please reload this page.
📆 일자: 26년 8월 7일(금)
발제 의도
1. 트랜잭션의 개념과 이를 보장하는 ACID 원칙에 대해 설명해주세요.
2. 트랜잭션 격리 수준 4가지와 각 수준에서 발생하는 데이터 이상 현상을 설명해주세요.
All reactions