TransactionSynchronization -> 트랜잭션을 시작하기 위해 만든 Connection 오브젝트를 어딘가에 저장해두고 이후에 호출되는 DAO메서드에서는 저장된 Connection을 가져다가 사용하게 하는 것.
TransactionDefinition 인터페이스 -> 트랜잭션의 동작 방식에 영향을 줄 수 있는 네가지 속성을 정의
Transaction Propagation -> 트랜잭션의 경계에서 이미 진행중인 트랜잭션이 있을때와 없을때 각각 어떻게 동작할 것인가
격리수준 -> 만약 모든 트랜잭션들이 독립적으로 동작한다면 성능이 저하됨
Timeout -> 트랜잭션을 수행하는 제한시간
Readonly -> 트랜잭션 내에서 데이터를 조작하는 시도를 막아줌
TransactionAdvice 가 TransactionDefinition 오브젝트를 생성하고 사용함
TransactionInterceptor -> 트랜잭션 경계설정 Advice 로 사용할 수 있도록 만들어짐
TransactionAttribute ->
propagation, isolation, readonly, time-out. -Exception1, +Exception2
TransactionInterceptor 이 transactionManager 와 transactionAttributes 를 수정자로 받음
A트랜잭션이 B트랜잭션에 참여하면 B트랜잭션의 속성을 따름
포인트컷이 부가기능을 적용할 후보 메서드들을 선정하고
어드바이스의 트랜잭션 전파속성에 따라 메소드별로 트랜잭션을 적용한다
등록과 조회 메서드에도 트랜잭션을 추가해야 하는 이유
등록 -> 다른 트랜잭션에 참여할 가능성이 높음, DB의 정보를 다루는 작업이 추가될 가능성이 높음
조회 -> readonly 로 설정하면 성능이 향상됨. 시간 지정 가능. 격리 수준에 따라 조회도 반드시 트랜잭션 안에서 진행해야 할 필요가 생기기도 함
타깃 오브젝트가 자기 자신의 메서드를 호출할 때는 프록시를 통한 부가기능의 적용이 일어나지 않음
@Transactional
@Target -> 애노테이션 사용할 대상 지정
@Retension -> 애노테이션 정보가 언제까지 유지되는지
@Inherited -> 상속을 통해서도 애노테이션 정보를 얻을 수 있게 함
TransactionAttributeSourcePoincut이 @Transacional이 달린 빈들을 모두 찾아 후보로 돌려줌.
AnnotationTransactionAttributeSource -> @Transactional 에서 트랜잭션 속성을 가져오고 TransactionInterceptor 가 이걸 씀
대체 정책 ->
타깃메서드에 @Transactional이 있나? -> 타깃 클래스에 있나? -> 선언 메서드에 있나? -> 선언 타입(클래스, 인터페이스) 에 있나?
DeclarativeTransaction -> AOP를 이용해 코드 외부에서 트랜잭션의 기능을 부여해주고 속성을 지정할 수 있게 하는 방법
ProgrammaticTransaction -> TransactionTemplate 이나 개별 데이터 기술의 트랜잭션 API를 사용해 직접 코드안에서 사용하는 방법
JdbcTemplate 은 트랜잭션이 시작된 것이 있으면 그 트랜잭션에 자동으로 참여함
테스트에 @Transactional -> 테스트 프레임워크에 의해 트랜잭션을 부여해주는 용도로 쓰임
메서드 실행 전에 트랜잭션을 생성해주고 메서드가 종료하면 트랜잭션이 종료됨
@Rollback(boolean)
애노테이션 이름 그대로 기능
메서드 레벨에서만 적용 가능
모든 테스트 메서드를 커밋시키고 싶으면?