코드 그라데이션

트랜잭션 관련 본문

백엔드 면접

트랜잭션 관련

완벽한 장면 2024. 4. 3. 23:59

트랜잭션(Transaction)

트랜잭션은 데이터베이스에서 수행되는 논리적인 작업 단위를 말한다.

이는 한 번에 수행되어야 하는 일련의 연산들을 의미하며, 데이터베이스에서의 안정성과 일관성을 보장하기 위해 사용된다.

트랜잭션은 다음의 네 가지 기본 속성인 ACID 특성을 갖추고 있다.

 

원자성 (Atomicity)

  • 트랜잭션의 모든 연산은 원자적인 단위로 간주되어, 전체 트랜잭션이 성공적으로 완료되거나 실패할 경우 모든 연산이 롤백되어야 한다.
  • 즉, 트랜잭션은 성공적으로 완료되면 모든 변경 사항이 반영되고, 실패할 경우 모든 변경 사항이 취소되어 이전 상태로 돌아가야 한다.

 

일관성 (Consistency)

  • 트랜잭션이 수행되기 전과 수행된 후에 데이터베이스는 일관된 상태를 유지해야 한다.
  • 트랜잭션이 일관성 있는 상태로만 데이터를 변경하도록 보장한다.

 

고립성 (Isolation)

  • 동시에 여러 트랜잭션이 수행될 때, 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않도록 고립되어야 한다.
  • 특히, 한 트랜잭션이 수행 중일 때 다른 트랜잭션에서 해당 트랜잭션의 중간 결과를 조회할 수 없어야 한다.

 

지속성 (Durability)

  • 트랜잭션이 성공적으로 완료되면 해당 트랜잭션에 의한 변경 사항은 영구적으로 데이터베이스에 저장되어야 한다.
  • 시스템 장애 또는 기타 문제가 발생해도 트랜잭션이 성공적으로 완료된 경우에는 변경 사항이 지속되어야 한다.

 

 

웹 통신에서는 동시성 문제가 매우 큰 화두로 떠오를 수 있다.

 

DB에서 각각의 WAS가 DB에 접속할 수 있는 길이 열려있기 때문이다.

그래서 이걸 통제하기 위해서 데이터베이스는 진짜 어마어마한 일들을 해야 한다.

 

데이터베이스를 개발하는 일은 운영체제를 만드는 일보다 절대 떨어지지 않는다.

버금가는 노력과 기술적 투자가 필요.

 

만약 누가 Read 하고 있는데 Write(INSERT/UPDATE) 해버리면 데이터가 훼손된다.

그러면 읽는 쪽에서는 과연 무슨 데이터를 읽을 것이냐.

이런 부분들이 엉켜버리면 거의 사고에 버금가는 이슈가 발생하기 때문에 막고자 하는 개념의 등장이 트랜잭션이다.

"작업의 논리적 단위"

 

원자성이 보장되어야 한다는 것은 처리가 일어나는 동안 외부 요인에 의해서 기대하지 않은 어떤 현상이 벌어지는 것을 막도록 해준다는 것.

 

관리의 단위가 TPS

 

 

정보를 수정해야 하는 경우

색깔이 노란색으로 바뀌고, 이걸 다시 저장해야 하는데 그 작업이 커밋이다.

 

만약 중간에 뻑나면 앞에 것도 다 날려버린다 => 롤백!!

 

 

문제는 이런 트랜잭션이 나는 동안에 접근하는 데이터가 일치해버리면?

교통정리가 잘못되었다면 망가진다.

그래서 나오는 게 동시성 관련 이슈.

 

동시성 관련 이슈

  • 커밋 완료 전 Read (Dirty read)
  • 커밋 완료 전 Overwrite
  • Read 중 데이터가 변경되는 경우
  • 변경한 데이터 유실 (Lost update)

 


트랜잭션의 격리 수준(Isolation Level)

동시성 제어를 위한 설정으로, 여러 트랜잭션이 동시에 수행될 때 각 트랜잭션이 다른 트랜잭션의 작업에 미치는 영향을

조절하는 역할.

네 가지 주요한 격리 수준은 다음과 같다.

 

1) READ UNCOMMITTED (읽기 미확인)

  • 가장 낮은 격리 수준이며, 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽을 수 있다.
  • 이로 인해 더 높은 동시성은 얻을 수 있지만, 데이터의 일관성을 보장할 수 없다.

 

2) READ COMMITTED (읽기 확인)

  • 트랜잭션이 커밋된 데이터만을 읽을 수 있다.
  • 커밋되지 않은 데이터는 다른 트랜잭션에 의해 변경될 수 있으며, 이는 트랜잭션 동안 일관성을 제공하지만 다른 문제를 발생시킬 수 있다.

3) REPEATABLE READ (반복 가능한 읽기)

  • 트랜잭션이 시작될 때 읽은 데이터는 트랜잭션이 종료될 때까지 변경되지 않음을 보장.
  • 다른 트랜잭션이 데이터를 변경하고 커밋해도, 현재 트랜잭션이 읽은 데이터는 변경되지 않은 것처럼 보인다.

 

4) SERIALIZABLE (직렬화 가능)

  • 가장 높은 격리 수준으로, 트랜잭션 간에 상호 작용이 완전히 격리된다.
  • 한 트랜잭션이 진행 중일 때는 다른 트랜잭션에서 해당 데이터를 읽거나 변경할 수 없다.
  • 처리 속도가 다른 격리 수준에 비해 느릴 수 있다.

격리 수준이 높아질수록 데이터 일관성은 더욱 확보되지만, 동시성은 감소한다.

 

 

 

 

 

 

728x90

'백엔드 면접' 카테고리의 다른 글

XSS와 CSRF 공격 예방  (0) 2024.04.05
온프레미스 환경에서 클라우드로 전환  (0) 2024.04.04
인덱싱  (0) 2024.04.02
APM과 부하 테스트  (0) 2024.04.01
GC와 JVM에 대해서  (0) 2024.03.30
Comments