본문 바로가기
카테고리 없음

트랜잭션

by jhdevtrace 2024. 10. 11.

 

 

트랜잭션은 데이터베이스에서 여러 작업을 하나의 논리적 단위로 묶어 처리하는 개념입니다.

트랜잭션 내 모든 작업이 성공해야만 데이터베이스에 반영되며, 중간에 하나라도 실패하면 전체 작업이 롤백되어 원래 상태로 복구됩니다.

이를 통해 데이터의 일관성과 무결성을 보장합니다. 트랜잭션은 ACID 원칙(원자성, 일관성, 고립성, 지속성)을 따르며, Spring에서는 @Transactional을 사용해 쉽게 관리할 수 있습니다.

 

 

ACID트랜잭션이 가져야 할, 데이터베이스 시스템에서 데이터의 일관성과 무결성을 보장하기 위한 원칙입니다.

 

원자성 : 트랜잭션 내에서 수행되는 작업들이 모두 성공하거나 모두 실패해야 합니다.

돈 보내다가 실패하면 다시 원래 잔액으로 돌려줘야 함

 

일관성 : 트랜잭션이 완료되면, 작업 이전과 일관성 있는 상태여야 합니다.

계좌 이체를 한 뒤에 음수 잔액이 존재하면 안된다는 조건이 있습니다.

 

고립성 : 동시에 실행되는 여러 트랜잭션이, 서로의 중간 상태를 참조하거나 간섭하지 않도록 해야합니다.

두 사람이 동시에 같은 계좌에서 돈을 인출해도, 한 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 계좌의 데이터를 변경하거나 읽을 수 없어야 합니다.

 

지속성 : 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 저장되어야 한다는 원칙입니다.

시스템 오류나 서버 장애가 발생하더라도, 트랜잭션의 결과는 데이터 베이스에 적용 되어야 합니다.

 

 

트랜잭션 전파 범위란?

트랜잭션이 어떻게 다른 트랜잭션과 상호작용할지를 결정하는 속성입니다.

 

각 트랜잭션이 기존 트랜잭션에 참여할지, 새로운 트랜잭션을 시작할지, 기존 트랜잭션을 유지할지 등의 방식을 정의할 수 있습니다.

 

Spring의 @Transactional 어노테이션을 사용할 때, **전파 속성(Propagation)**을 설정하여 트랜잭션의 전파 방식을 지정할 수 있습니다.

 

REQUIRED (기본 값)

  • 기존 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작합니다.

 

REQUIRES_NEW

  • 항상 새로운 트랜잭션을 시작하고, 기존 트랜잭션이 있으면 일시 중지합니다. 새로운 트랜잭션이 끝나면, 기존 트랜잭션이 다시 진행됩니다.

 

SUPPORTS

NOT_SUPPORTED : 트랜잭션이 있더라도 트랜잭션 없이 실행되도록 합니다. MANDATORY : 반드시 기존 트랜잭션이 존재해야 합니다.

NEVER : 트랜잭션 없이 실행해야 합니다. 만약 트랜잭션이 있으면 예외를 발생시킵니다

NESTED : 기존 트랜잭션 안에서 중첩된 트랜잭션을 시작합니다