트랜잭션

최혜린·2025년 3월 16일

트랜잭션이란?

"하나의 작업 단위"

→ 여러개의 DB 작업을 하나의 묶음으로 보고, "다 성공하면 commit, 하나라도 실패하면 rollback" 하는 개념이다.


왜 필요할까?

  • 데이터 일관성 보장
  • 중간 실패 시 데이터 꼬임 방지
1. A 계좌에서 10만원 출금
2. B 계좌로 10만원 입금

만약 1번 출금은 성공했는데, 2번 입금에서 에러 발생하면?
→ A 계좌는 10만원이 빠졌는데 B 계좌는 돈을 못 받음 = 💥 데이터 불일치!

그래서 트랜잭션으로 묶어서,

"모두 성공해야만 DB에 적용(commit)"
"하나라도 에러가 나면 모두 취소(rollback)"
하는 보호막을 만들어줘야 한다.!


트랜잭션 4대 원칙 (ACID)

  1. Atomicity (원자성)
    →여러 작업이 하나의 작업처럼 "모두 or 아무것도" 로 실행된다.

  2. Consistency (일관성)
    → 트랜잭션 전후에 DB가 항상 일관된 상태를 유지한다.

  3. Isolation (격리성)
    → 동시에 여러 트랜잭션이 실행돼도 서로 간섭하면 안된다 (동시성 문제 방지)

  4. Durability (지속성)
    →커밋된 데이터는 DB에 영구적으로 남는다.


트랜잭션 = "DB 작업을 안전하게 묶는 보호막"

하나의 흐름 안에서 여러 작업을 DB에 수행할 때 필수!
동시성 문제, 데이터 불일치, 중간 실패를 방지할 수 있음


SQL에서 트랜잭션

  • SQL에서 트랜잭션은 트랜잭션 명령어로 직접 관리해줘야 한다.
START TRANSACTION; -- 트랜잭션 시작

UPDATE accounts SET balance = balance - 10000 WHERE id = 1; -- A 계좌 출금
UPDATE accounts SET balance = balance + 10000 WHERE id = 2; -- B 계좌 입금

COMMIT; -- 모두 성공하면 커밋 (적용)

-- 실패하면
ROLLBACK; -- 에러 발생 시 롤백 (취소)
  • 직접 START TRANSACTION, COMMIT, ROLLBACK 을 작성해야 함
  • 트랜잭션 처리 로직이 코드마다 반복됨
  • 커넥션 연결/닫기 코드도 수동으로 작성해야 함

Spring에서 트랜잭션

  • Spring + JPA 에서는 @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); // 입금
    } 
}

트랜잭션은 비즈니스 로직의 무결성과 안정성을 지키는 중요한 장치다!

profile
산으로 가는 코딩.. 등산 중..🌄

0개의 댓글