[20220328] 개발자 일기 & TIL
집안 사정으로 인해 지난주에 TIL을 하지 못했다. 지지난주부터 조짐이 있었는데 일이 터져버리는 바람에 어쩔 수가 없었다. 이번 주부터는 열심히 다시 시작해보려고 한다.
스프링 @Transactional 애너테이션의 propagation 옵션
Propagation.REQUIRED: 기본값. 부모 트랜잭션 있으면 부모 트랜잭션 내에서 실행. 없으면 새로운 트랜잭션 생성.
자식 트랜잭션 내 예외 발생 시 부모 트랜잭션도 롤백.
Propagation.REQUIRED_NEW: 항상 새로운 트랜잭션 생성.
부모 트랜잭션과 자식 트랜잭션이 독립적이므로, 자식 트랜잭션 내에서 예외 발생 시 자식 트랜잭션만 롤백되고 부모 트랜잭션은 롤백 안 됨.
Propagation.NESTED: 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있다.
둘러싼 부모 트랜잭션이 없을 경우 Propagation.REQUIRED와 동일하게 작동한다. 차이점은 SAVEPOINT를 지정한 시점까지 부분 롤백이 가능하다.(SAVEPOINT 지원 데이터베이스만 사용 가능)
Propagation.MANDATORY: 부모 트랜잭션이 있을 경우에만 실행. 그렇지 않으면, 예외 발생.
-> 혼자서는 사용 불가.
Propagation.SUPPORTS: 부모 트랜잭션이 있으면 부모 트랜잭션으로 동작하고, 그렇지 않으면 non-transactional로 동작.
-> 자식 트랜잭션으로서만 사용, 그 외에는 트랜잭션을 사용하지 않음.
Propagation.NOT_SUPPORT: non-transactional로 실행, 부모 트랜잭션이 존재하면 일시 정지.
-> 트랜잭션을 사용하지 않음. 사용하면 일단 보류.
Propagation.NEVER: non-transactional로 실행, 부모 트랜잭션이 존재하면 예외 발생.
-> 트랜잭션을 사용하지 않음. 사용하면 예외.