트랜잭션이란?

Yi suho·2023년 6월 6일
0
post-thumbnail

트랜잭션은 데이터베이스 에서 하나의 논리적인 작업 단위를 말한다.

데이터베이스에서의 트랜잭션은 어떠 한 작업이 모두 성공하거나 모두 실패해야만 하는데,

이는 데이터베이스의 일관성와 무결성을 보장하기 위해 필요하다.

1.원자성

  • 트랜잭션의 모든 작업이 완전히 수행되거나, 전혀 수행되지 않아야 한다.
    즉 트랜잭션이 성공하면 모든 변경상항이 데이터베이스에 반영되어야 하며,트랜잭션이 실패하면 모든 변경 사항이 롤백되어야 한다.

2.일관성

  • 트랜잭션이 실행 전후에 데이터베이스의 일관성이 유지되어야 합니다.
    즉 트랜잭션 수행중 데이터 베이스의 상태는 일관된 상태를 유지해야 한다.

3.격리성

  • 동시에 실행되는 여러 트랜잭션이 서로에게 영향을 미치지 않도록 격리되어야 한다.
    즉 하나의 트랜잭션이 수행중인 데이터를 다른 트랜잭션이 접근하지 못하도록 제어해야 한다.

4.지속성

  • 트랜잭션이 성공하면 그 결과가 항상 데이터베이스에 기록되어야 한다.
    즉 시스템에 장애가 발생하더라도 트랜잭션 결과는 보존되어야 한다.

이러한 특징들을 충족 시키기 위해 트랜잭션은 commit 또는 rollback 명령을 사용하여 완료 된다.

commit 명령은 트랜잭션 작업을 데이터베이스에 영구적으로 적용하고 rollback 명령은 트랜잭션 작업을 모두 취소 한다.

트랜잭션 격리 수준

  • Read Uncommitted(RU) : 가장 낮은 격리 수준으로, 다른 트랜잭션에서 변경 중인 데이터를 읽을 수 있다.
    이는 Dirty Read(더티 리드)현상이 발생할 수 있으며, 데이터 무결성이 보장 되지 않는다.
  • Read Committed (RC) : 트랜잭션이 완료된 데이터만 읽을 수 있다.
    이는 Dirty Read 현상을 방지 할 수 있으나,Non-Repeatable Read(비 Repeatable Read) 현상이 발생할 수 있다.
  • Repeatable Read (RR): 트랜잭션 내에서 같은 쿼리를 여러번 실행해도 항상 같은 결과를 보장합니다.
    이는 Non-Repeatable Read 현상을 방지할 수 있으나, Phantom Read(팬텀 리드) 현상이 발생할 수 있다.
  • Serializable (S) : 가장 높은 격리 수준으로, 동시에 여러 트랜잭션이 실행되더라도 순차적으로 실행되는 것처럼 보장한다. 이는 PhantomRead 현상을 방지 할 수 있다.

격리 수준이 높을수록 제이터의 일관성과 무결성을 보장할 수 있지만 동시성 처리의 성능이 저하될 수 있다.

따라서 격리 수준은 애플리케리션의 요구사항과 데이터베이스의 처리 성능을 고려하여 적절하게 설정해야 한다.

ㅁ Phantom Read

  • 트랜잭션이 동시에 처리될 때 두 번째 트랜잭션에서 첫번째 트랜잭션에서 처리된 데이터와는 다른 결과를 보여주는 현상이다.

예를들어 첫 번째 트랜잭션에서는 “A”와 “B” 데이터만 있는 테이블을 조회하고
두 번째 트랜잭션에서는 “A”,”B”, 그리고 “C” 데이터를 추가한 후 조회한다고 가정해보면

이때 첫 번째 트랜잭션과 두 번째 트랜잭션이 동시에 처리된다면 두 번째 트랜잭션에서는 “A”,”B”,”C” 데이터가 조회 될것이다.

이는 첫 번쨰 트랜잭션에서 조회된 데이터와는 다른 결과를 보여주는것이다.

Phantom Read 는 Repeatable Read 격리 수준에서 발생할 수 있으며,Serializable 격리 수준에서는 방지할 수 있다.
이러한 현상은 다수의 트랜잭션이 동시에 처리될 때 발생 할 수 있기 때문에 격리 수준을 적절하게 설정하는것이 중요하다.

0개의 댓글