해결된 질문
작성
·
366
0
내부 트랜잭션이 롤백되면 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
와 같은 새로운 트랜잭션 전파 옵션을 사용하는 것이 올바른 접근 방식입니다.
이러한 트랜잭션 관리의 관점을 이해하기 위해서는, 스프링의 트랜잭션 추상화와 트랜잭션 전파에 대한 심도있는 학습이 필요하며, 스프링의 공식 문서 및 관련 전문가의 강의를 참고하는 것이 도움이 될 것입니다.