@Transactional - 트랜잭션화 시키기 위해 사용하는 어노테이션
@EnableTransactionManagement - 트랜잭션 어노테이션을 사용하기위해 꼭 붙여주어야 한다.
- 클래스, 메서드 위에 어노테이션을 추가하면 된다.
- 트랜잭션 기능이 적용된 프록시 객체가 생성된다.
트랜잭션에서 일관성이 없는 데이터를 허용하는 수준
- 일관성이 높아질수록 성능 저하가 생김.
사용법 -
@Transactional(isolation=lsolation.DEFAULT)
- DEFAULT
- READ_UNCOMMITTED (Dirty Read 발생)
- 커밋되지 않은 데이터도 읽기를 허용
- READ_COMMITTED (Dirty Read 방지)
- 커밋이 확정된 데이터만 읽기를 허용
- REPEATABLE_READ (Non-Repeatable Read 방지)
- 트랜잭션이 완료될 때까지 다른 사용자는 읽기가 불가능
- SERIALIZABLE (Phantom Read 방지) - 가장 빡빡한 단계
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황
- 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성값
- REQUIRED
- 디폴트 속성 (부모 트랜잭션 안에서 자식(내부) 트랜잭션까지 실행)
- SUPPORTS
- 이미 시작된 트랜잭션이 있으면 참여하고 없으면 트랜잭션이 없이 진행
- REQUIRES_NEW
- 부모 안에서 자식이 있어도 자식을 위한 트랜잭션을 새로 생성해서 동작
- NESTED
- 이미 진행중인 트랜잭션이 있는 경우 중첩 트랜잭션을 시작함
- 중첩 트랜잭션은 먼저 시작된 부모 트랜잭션이 커밋되었는지에 대해선 영향을 받지만 안에 있는 중첩 트랜잭션이 커밋되었는지는 부모에게 영향을 주지 않는다
- 사용 예시 - 일기 작성 관련해서 로그를 DB에 저장하는 상황
로그 저장이 실패한다고 해서-> 일기 작성까지 롤백되면 안됨
일기 작성이 실패한다면-> 로그 작성까지 롤백되어야 함
트랜잭션을 읽기 전용 속성으로 지정
읽기 전용으로 지정 시 성능이 향상됨.
- @Transactional(readOnly=true)
예외 발생했을 때 트랜잭션 롤백시킬 경우를 설정
- @Transactional(rollbackFor=Exception.class)
- 익센션에 대해 롤백하고 싶을 때 사용
- @Transactional(noRollbackFor=Exception.class)
- 특정 익셉션은 그냥 롤백하지 않고 진행시키길 원할 때 사용
- Default : RuntimeException, Error
일정 시간 내에 트랜잭션 끝내지 못하면 롤백
- @Transactional(timeout=10)