You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
트랜잭션을 사용하려면 먼저 스프링 빈에 등록된 어떤 트랜잭션 매니저를 사용할지 알아야 한다. 생각해보면 코드로 직접 트랜잭션을 사용할 때 분명 트랜잭션 매니저를 주입 받아서 사용했다. @Transactional 에서도 트랜잭션 프록시가 사용할 트랜잭션 매니저를 지정해주어야 한다.
사용할 트랜잭션 매니저를 지정할 때는 value , transactionManager 둘 중 하나에 트랜잭션 매니저의 스프링 빈의 이름을 적어주면 된다. 이 값을 생략하면 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략한다.
그런데 사용하는 트랜잭션 매니저가 둘 이상이라면 다음과 같이 트랜잭션 매니저의 이름을 지정해서 구분하면 된다.
✅ rollback
예외 발생시 스프링 트랜잭션의 기본 정책은 다음과 같다.
언체크 예외인 RuntimeException , Error 와 그 하위 예외가 발생하면 롤백한다. 체크 예외인 Exception 과 그 하위 예외들은 커밋한다.
⏺️ noRollbackFor
앞서 설명한 rollbackFor 와 반대이다. 기본 정책에 추가로 어떤 예외가 발생했을 때 롤백하면 안되는지 지정할 수있다.
예외 이름을 문자로 넣을 수 있는 noRollbackForClassName 도 있다.
propagation
propagation트랜잭션전파에대한옵션이다. 자세한내용은뒤에서설명한다.
isolation
트랜잭션 격리 수준을 지정할 수 있다. 기본 값은 데이터베이스에서 설정한 트랜잭션 격리 수준을 사용하는 DEFAULT이다.
대부분 데이터베이스에서 설정한 기준을 따른다. 애플리케이션 개발자가 트랜잭션 격리 수준을 직접 지정하는 경우는 드물다.
DEFAULT : 데이터베이스에서 설정한 격리 수준을 따른다.
READ_UNCOMMITTED : 커밋되지 않은 읽기
READ_COMMITTED : 커밋된 읽기
REPEATABLE_READ : 반복 가능한 읽기
SERIALIZABLE : 직렬화 가능
timeout
트랜잭션 수행 시간에 대한 타임아웃을 초 단위로 지정한다. 기본 값은 트랜잭션 시스템의 타임아웃을 사용한다. 운영 환경에 따라 동작하는 경우도 있고 그렇지 않은 경우도 있기 때문에 꼭 확인하고 사용해야 한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
5️⃣ 트랜잭션 AOP 주의 사항 - 프록시 내부 호출1
✅ 위 코드 설명 CallService
external() : 트랜잭션이 없음 (@transactional)
internal() : 트랜잭션이 있음 (@transactional)
@transactional이 하나라도 있으면 트랜잭션 프록시 객체가 만들어진다. 그리고 callService 빈을 주입 받으면 트랜잭션 프록시 객체가 대신 주입된다.
✅ interalCall() 실행
internalCall()은 트랜잭션이 있는 코드인 internal()을 호출한다.
internal()
6️⃣ 트랜잭션 AOP 주의 사항 - 프록시 내부 호출2
메서드 내부 호출 때문에 트랜잭션 프록시가 적용되지 않는 문제를 해결하기 위해 별도의 internal() 메서드를 클래스로 분리하자.
InternalCallV2Test
📝 위 코드 설명
➡️위 코드의 흐름
internal()
external()
✅ public 메서드만 트랜잭션 적용
7️⃣ 트랜잭션 AOP 주의 사항 - 초기화 시점
초기화 코드(예: @PostConstruct )와 @transactional 을 함께 사용하면 트랜잭션이 적용되지 않는다.
왜냐하면 초기화 코드가 먼저 호출되고, 그 다음에 트랜잭션 AOP가 적용되기 때문이다. 따라서 초기화 시점에는 해당 메서드에서 트랜잭션을 획득할 수 없다.
8️⃣ 트랜잭션 옵션 소개
✅ value, transactionManager
@Transactional에서도 트랜잭션 프록시가 사용할 트랜잭션 매니저를 지정해주어야 한다.사용할 트랜잭션 매니저를 지정할 때는
value,transactionManager둘 중 하나에 트랜잭션 매니저의 스프링 빈의 이름을 적어주면 된다. 이 값을 생략하면 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략한다.✅ rollback
RuntimeException,Error와 그 하위 예외가 발생하면 롤백한다. 체크 예외인Exception과 그 하위 예외들은 커밋한다.⏺️ noRollbackFor
앞서 설명한
rollbackFor와 반대이다. 기본 정책에 추가로 어떤 예외가 발생했을 때 롤백하면 안되는지 지정할 수있다.예외 이름을 문자로 넣을 수 있는
noRollbackForClassName도 있다.propagation
DEFAULT이다.timeout
트랜잭션 수행 시간에 대한 타임아웃을 초 단위로 지정한다. 기본 값은 트랜잭션 시스템의 타임아웃을 사용한다. 운영 환경에 따라 동작하는 경우도 있고 그렇지 않은 경우도 있기 때문에 꼭 확인하고 사용해야 한다.
timeoutString도 있는데, 숫자 대신 문자 값으로 지정할 수 있다.
All reactions