데이터베이스 작업의 일련의 연산들을 하나의 논리적인 작업 단위로 묶은 것을 말한다.
트랜잭션의 핵심은 "모든 것이 성공적으로 처리되거나 아무 것도 처리되지 않아야 한다"는 원칙이다.
데이터베이스 작업을 안전하고 신뢰성 있게 처리하기 위한 매커니즘이다.
이러한 특성 덕분에 여러 사용자나 애플리케이션에 데이터베이스에 동시 접근하더라도,
데이터의 일관성과 정확성이 유지된다.
트랜잭션의 특성은 ACID라는 4가지 속성으로 요약된다.
원자성(Atomicity)
트랜잭션의 모든 연산이 성공적으로 수행되거나 아니면 하나도 수행되지 않아야 한다.
ex) 은행 계좌 이체 작업을 생각해보면,
돈을 보내는 계좌에서 차감하는 작업과
받는 계좌에 입금하는 작업이
모두 성공하거나, 둘 다 실패해야한다.
일관성(Consistency)
트랜잭션의 수행 전과 후에 데이터베이스는 일관된 상태를 유지해야한다.
ex) 데이터베이스에 일관성 있는 규칙이 있다면 (계좌 잔액은 음수가 될 수 없음),
트랜잭션이 완료된 후에도 이 규칙이 깨지지 않아야한다.
고립성(Isolation)
동시에 여러 트랜잭션이 실행되더라도, 각 트랜잭션은 서로에게 영향을 주지 않는 독립적인 상태로 실행되어야한다.
ex) 두 사람이 동시에 같은 계좌에 접근해도, 한 사람의 작업은 다른 사람의 작업에 영향을 주지 않는다.
지속성(Durability)
트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 저장되어야한다.
시스템의 오류나 장애가 발생하더라도, 완료된 트랜잭션의 결과는 보존되어야한다.
ex) 계좌 송금 시, 양쪽 계좌 각각에서 차감과 입금이 실행되어야한다.
이 두 단계 중 하나라도 실패하면 트랜잭션 전체가 실패한 것으로 간주된다. 초기 상태로 롤백(취소)되어야한다.
만약 트랜잭션이 성공적으로 완료되면 그 결과(차감된 금액, 입금된 금액)는 데이터베이스에 영구적으로 저장되어야한다.
여기서 만약 시스템에 문제가 발생해도, 이전의 트랜잭션 결과는 안전하게 보존되어있어야한다.
우리가 @Transactional을 사용하는 주된 이유는
데이터베이스 작업을 트랜잭션이라는 단위로 묶어 관리하기 위함이다.
트랜잭션은 테이터베이스 작업의 일련의 과정을 의미.
이 일련의 과정은 위와 같은 ACID 속성을 만족해야한다.
예를들어
두 개의 데이터베이스 테이블에 데이터를 동시에 삽입해야하는 상황이 있다고 가정.
첫번째 삽입은 성공했지만,
두번째 삽입에서 문제가 발생했다면 어떻게 해야할까?
일반적인 상황에서는 첫번째 삽입을 취소(롤백)해야한다.
이렇게 하려면 두 삽입 연산을 하나의 트랜잭션으로 묶어야하며,
@Transactional 어노테이션을 사용하면 이를 쉽게 할 수 있다.
@Transactional이 붙은 메서드가 호출되면
새로운 트랜잭션이 시작된다.
메서드 내의 데이터베이스 연산이 수행된다.
문제가 없다면 트랜잭션은 커밋되어 모든 변경이 데이터베이스에 반영된다.
만약 중간에 예외가 발생하면, 트랜잭션은 자동으로 롤백되어 메서드 호출 이전 상태로 되돌린다.
이렇게 하면 원자성과 일관성을 유지할 수 있다.
격리성과 지속성은 데이터베이스 설정과 관련이 있으므로
@Transactional 어노테이션만으로는 완전히 보장할 수 없다.
'개인 공부 (23.07~' 카테고리의 다른 글
HTTP 개념, 특성, 구조 - 기본적인 정리 (0) | 2023.08.27 |
---|---|
[JAVA] 자바는 다중상속을 지원하지 않는다? (0) | 2023.08.25 |
[JAVA] extends(상속), implements(구현) 쉽게 정리 (0) | 2023.08.25 |
프로젝트 패키지 구조 (기능 / 계층) (0) | 2023.08.24 |
웹 용어 정리 (0) | 2023.08.23 |