rollbackOnly 값 변경에 대해 질문 있습니다!
내부 트랜잭션이 롤백되면 rollbackOnly 값을 true로 설정하고, 외부 트랜잭션 커밋시점에 트랜잭션 매니저가 이 값을 확인하여 롤백한다. 그리고 만약 내부 트랜잭션이 롤백 되어도 외부 트랜잭션은 커밋을 유지시키고 싶다면, REQUIRES_NEW를 사용하여 구현 가능하다는 것으로 이해하였습니다!
그런데 이때 REQUIRES_NEW를 사용하는 대신 rollbackOnly 값을 다시 false로 변경하여 해결할 수는 없는건가요?
(TransactionStatus 메서드에도 true로 변경하는 메서드만 있더라구요)
스프링이 이렇게 값 변경을 막은(?) 이유가 궁금합니다..!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. Believer님의 질문에 답변 드리겠습니다.
내부 트랜잭션이 롤백된 상태에서 rollbackOnly 값을 true로 설정하면 해당 트랜잭션 범위에서 발생한 변경사항들이 롤백됩니다. 외부 트랜잭션 커밋 시점에서 트랜잭션 관리자가 rollbackOnly 플래그를 체크하여 롤백 여부를 결정합니다.
REQUIRES_NEW를 사용하는 것은 새로운 트랜잭션을 시작하기 위함으로, 내부 트랜잭션의 롤백이 외부 트랜잭션에 영향을 주지 않도록 하는데 사용됩니다. 반면에, rollbackOnly 플래그를 false로 변경하는 것은 트랜잭션 스펙에 위배되며, 한 번 롤백으로 표시된 트랜잭션을 다시 커밋 가능한 상태로 변경하는 것은 일반적으로 허용되지 않습니다.
이는 트랜잭션의 원자성(Atomicity)을 보장하기 위한 것으로, 일단 롤백이 결정되면, 해당 트랜잭션 범위 내의 연산이 전체적으로 취소되어야 하며, 부분적인 성공이 발생하지 않도록 하는 것입니다. 만약 rollbackOnly 값을 임의로 변경할 수 있게 한다면, 트랜잭션의 안정성과 일관성을 보장할 수 없게 됩니다.
TransactionStatus의 API 문서를 보면, setRollbackOnly 메서드는 트랜잭션을 롤백만 할 수 있도록 표시하는 메서드이며, 한 번 롤백을 위한 표시가 되면, 이를 해제하는 API는 제공되지 않습니다.
따라서, 내부 트랜잭션이 롤백되더라도 외부 트랜잭션을 독립적으로 유지하고 싶다면, REQUIRES_NEW와 같은 새로운 트랜잭션 전파 옵션을 사용하는 것이 올바른 접근 방식입니다.
이러한 트랜잭션 관리의 관점을 이해하기 위해서는, 스프링의 트랜잭션 추상화와 트랜잭션 전파에 대한 심도있는 학습이 필요하며, 스프링의 공식 문서 및 관련 전문가의 강의를 참고하는 것이 도움이 될 것입니다.
RepositoryTest의 패키지 위치가 domain인 이유
0
30
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
30
1
update()에 사용하는 setter 질문드립니다.
0
48
1
SQL 중심적 개발의 문제점에 대한 질문
0
72
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
84
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
176
1
@repository 어노테이션
0
89
3
ItemService
0
58
1
논리 커밋, 물리 커밋 질문드립니다.
0
54
1
내부 트랜잭션 커밋은 필수인가요?
0
57
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
54
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
178
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
78
1
@EventListener(ApplicationReadyEvent.class) 관련
0
88
1
트랜잭션 동기화 매니저와 데이터 소스
0
76
1
DB 관련 강의 개설 계획은 없으신건가요?
0
133
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
94
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
112
1
트랜잭션 전파 질문.
0
87
1
프로젝트 오픈 에러
0
126
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
84
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
73
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
102
1
커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문
0
98
2





