→ 여러개의 DB 작업을 하나의 묶음으로 보고, "다 성공하면 commit, 하나라도 실패하면 rollback" 하는 개념이다.
1. A 계좌에서 10만원 출금
2. B 계좌로 10만원 입금
만약 1번 출금은 성공했는데, 2번 입금에서 에러 발생하면?
→ A 계좌는 10만원이 빠졌는데 B 계좌는 돈을 못 받음 = 💥 데이터 불일치!
그래서 트랜잭션으로 묶어서,
"모두 성공해야만 DB에 적용(commit)"
"하나라도 에러가 나면 모두 취소(rollback)"
하는 보호막을 만들어줘야 한다.!
Atomicity (원자성)
→여러 작업이 하나의 작업처럼 "모두 or 아무것도" 로 실행된다.
Consistency (일관성)
→ 트랜잭션 전후에 DB가 항상 일관된 상태를 유지한다.
Isolation (격리성)
→ 동시에 여러 트랜잭션이 실행돼도 서로 간섭하면 안된다 (동시성 문제 방지)
Durability (지속성)
→커밋된 데이터는 DB에 영구적으로 남는다.
트랜잭션 = "DB 작업을 안전하게 묶는 보호막"
하나의 흐름 안에서 여러 작업을 DB에 수행할 때 필수!
동시성 문제, 데이터 불일치, 중간 실패를 방지할 수 있음
START TRANSACTION; -- 트랜잭션 시작
UPDATE accounts SET balance = balance - 10000 WHERE id = 1; -- A 계좌 출금
UPDATE accounts SET balance = balance + 10000 WHERE id = 2; -- B 계좌 입금
COMMIT; -- 모두 성공하면 커밋 (적용)
-- 실패하면
ROLLBACK; -- 에러 발생 시 롤백 (취소)
@Transaction 어노테이션으로 트랜잭션 관리가 자동화 된다. @Service
@RequiredArgsConstructor
public class TransferService {
private final AccountRepository accountRepository;
@Transactional
public void transfer(Long fromId, Long toId, int amount) {
Account from = accountRepository.findById(fromId)
.orElseThrow();
Account to = accountRepository.findById(toId)
.orElseThrow();
from.setBalance(from.getBalance() - amount); // 출금
to.setBalance(to.getBalance() + amount); // 입금
}
}
트랜잭션은 비즈니스 로직의 무결성과 안정성을 지키는 중요한 장치다!