일련의 작업들을 묶어서 하나의 단위로 처리하고 싶은 경우 사용한다. @Transactional
이 적용된 모든 클래스/메서드에 대한 프록시 생성하게된다. 해당 프록시는 트랜잭션을 시작/커밋하기위해 실행 중인 메서드의 전후로 트랙잭션 로직을 주입하게 된다.
메서드가 종료될 때 자동으로 데이터들이 롤백된다.
Auto Increment는 동시성 이슈 때문에 트랙잭션 범위 밖에서 이루어지기에 Auto Increment Id는 롤백되지 않는다.
No, auto-increment mechanisms must work outside the scope of transactions, because another user may be inserting to the same table before you finish your transaction. The other user's transaction must be able to allocate the next value, before knowing whether your transaction is using the value you just allocated.
@Transactional
을 달아놓은 메소드가 동일한 클래스 내의 다른 메소드에 의해 호출된다면 트랜잭션이 정상 작동하지 않는다.@Transactional
은 인스턴스에서 처음으로 호출하는 메서드나 클래스의 속성을 따라가게 되어서 동일한 class안에 상위 메소드에 @Transactional
이 없으면 하위에 선언되어 있다하더라도 전이되지 않는다. @Transactional
을 상위로 배치 또는 메서드를 분리하면 해당 문제를 해결할 수 있다.@Transactional
어노테이션이 선언되면 메소드에 대해 트랜잭션이 적용된 프록시 객체를 생성한다.JDBC를 통한 접근(DatasourceTransactionManager)을 사용하던 JPA(JpaTransactionManager)를 사용하던 @Transactional
을 사용할 수 있습니다. 이는 여러 서비스들을 하나의 추상화로 묶어 놓은 PSA가 사용되었기 때문이다.
클래스 메소드 > 클래스 > 인터페이스 메소드 > 인터페이스