- 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위
- 데이터의 정합성을 보장하기 위해 고안된 방법이다.
- 데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위
- 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
- Spring 프레임워크에서 데이터베이스 트랜잭션을 관리하기 위해 사용되는 어노테이션
- 이 어노테이션은 트랜잭션을 선언적으로 관리할 수 있게 하며, 데이터의 일관성과 무결성을 유지하는 데 중요한 역할을 한다.
예를 들어보자
@Service
public class BankService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, int amount) {
// 1. A 계좌에서 출금
Account fromAccount = accountRepository.findById(fromAccountId)
.orElseThrow(() -> new AccountNotFoundException("A 계좌를 찾을 수 없습니다."));
fromAccount.withdraw(amount); // 출금 메소드 호출
// 2. B 계좌에 입금
Account toAccount = accountRepository.findById(toAccountId)
.orElseThrow(() -> new AccountNotFoundException("B 계좌를 찾을 수 없습니다."));
toAccount.deposit(amount); // 입금 메소드 호출
// 3. 각 계좌를 업데이트하여 DB에 저장
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
@Transactional 어노테이션은 해당 메소드 내에서 모든 DB 연산을 하나의 트랜잭션으로 묶는다. 예를 들어, 출금이 성공했지만 입금 중에 오류가 발생하면, 트랜잭션 전체가 롤백되고, A 계좌에서 차감된 금액은 복구된다.예외를 잡는 경우: 메서드 내에서 발생한 예외를 try-catch 블록으로 잡아 처리하면 해당 예외는 트랜잭션의 롤백을 유발하지 않는다. 이 경우, 명시적으로 트랜잭션을 롤백하려면 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();를 호출해야 한다.
@Transactional(readOnly = true) 사용