A 계좌에서 B계좌로 만원을 이체한다.
기능을 실현하기 위해서는 A 계좌에서 만원을 인출하는 UPDATE문
과 B 계좌로 만원을 입금하는 UPDATE문
이라는 작업을 필요로 한다.import java.sql.Connection;
Connection connection = dataSource.getConnection();
try (connection) {
connection.setAutoCommit(false);
// 비즈니스 로직
connection.commit();
} catch (SQLException e) {
connection.rollback();
} finally {
connection.close();
}
@Transactional
도 내부적으로는 동일하게 동작한다.connection.setAutoCommit(false)
로 자동 커밋이 되지 않도록 한다.TransactionTemplate
@Service
public class UserService {
@Autowired
private TransactionTemplate template;
public Long registerUser(User user) {
Long id = template.execute(status -> {
// SQL 실행
// ex) inserts the user into the db and returns the autogenerated id
return id;
});
}
}
PlatformTransactionManager 구현체 사용
public class PaymentService {
private PlatformTransactionManager transactionManager;
public void setTransactionManager(PlatformTransactionManager transactionManager){
this.transactionManager = transactionManager;
}
public void transactionCode() throws Exception {
TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// execute some SQL statements...
this.transactionManager.commit(status);
} catch (RuntimeException e) {
this.transactionManager.rollback(status);
throw e;
}
}
}
public class UserService {
@Transactional
public Long registerUser(User user) {
// execute some SQL that e.g.
// inserts the user into the db and retrieves the autogenerated id
// userDao.save(user);
return id;
}
}
@Transactional
을 붙이면, 빈을 등록할 때 해당 메서드를 오버라이딩한 프록시 객체가 생성되어 원본 객체 대신 빈으로 등록된다.주의점
@Transactional
이 적용되어 있다고 하자. 이때, A 메서드가 B 메서드를 호출하는 경우 @Transactional
이 적용되지 않는다.public class BooksImpl implements Books {
public void addBooks(List<String> bookNames) {
bookNames.forEach(bookName -> this.addBook(bookName));
}
@Transactional
public void addBook(String bookName) {
Book book = new Book(bookName);
bookRepository.save(book);
book.setFlag(true);
}
}
@Transactional
을 붙여도 트랜잭션이 동작하지 않는다.@Transactional
이 붙은 메서드가 다른 클래스의 @Transactional
이 붙은 메소드를 호출하는 경우, 트랜잭션 전파 속성에 따라 트랜잭션이 동작한다.트랜잭션 전파 속성
트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성
REQUIRED
REQUIRED_NEW
MANDATORY
NESTED
NEVER
SUPPORTS
NOT_SUPPORTED
참고