하나의 비즈니스 로직에서 하나의 트랜젝션을 만들기 위해서는 비즈니스 로직 시작전에? 트랜잭션을 열어주어야 한다.
그 후 트랜잭션을 파라미터로 이 트랜잭션에 모든 쿼리가 입력이 되는데, 하나라도 실패하면 그냥 트랜잭션 실패해버릴듯.
스프링에서 이런 트랙잭션 활용 도와준다.
트랜잭션 동기화란
-> 스프링 JDBC에서 트랜잭션을 생성
-> 트랜잭션 동기화 매니저에 이 트랜잭션(커넥션) 저장
-> JDBC 템플릿이 쿼리를 날릴 때 커넥션이 트랜잭션 동기화 매니저에 존재한다면 가져옴
-> 여러 쿼리문을 하나의 로컬 트랜잭션(커넥션)으로 관리 가능하다.
(기존 방식 -> 파라미터로 트랜잭션 넘길 필요가 없어 졌지)
스프링은 더 나아가 도와준다 -> 트랜잭션 추상화 (DI 트랜잭션으로 나아 갈수 있는 인터페이스를 정의하고 그 인터페이스에만 의존하도록)
선언적 트랜잭션
-> @Transanctional
트랜잭션 속성
propagation 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성
required 전파의 기본 속성-> 트랜잭션이 있으면 참여하고, 없으면 새로 시작
requires_new 진행 중인 트랜잭션이 있다면 트랜잭션 잠시 보류
supports 이미 트랜잭션이 있으면 참여 그렇지 않다면 트랜잭션 없이 진행
nested 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션 시작. 부모 트랜잭션 커밋, 롤백엔 영향을 받음. 자신의 커밋, 롤백은 부모 트랜잭션에 영향 못 줌.
never 트랜잭션을 사용하지 않게 한다. 트랜잭션이 존재하면 예외 발생.
not_supported 트랜잭션을 사용하지 않게 한다. 트랜잭션이 있다면 보류한다.
isolation 여러 트랜잭션이 진행될 떄에 트랜잭션의 작업 결과를 타 트랜잭션에게 어떻게 노출할지 결정
default
timeout 트랜잭션의 제한 시간을 설정할 수 있다.
readOnly 트랜잭션 내에서 데이터 조작 시도 막음. 읽기만하게 하니 다른 오버헤드 감소 성능 증가에 도움.
rollback-for 기본적으로는 런타임에러시 롤백, 롤백 대상으로 삼고 싶다면 사용 가능.