230405 Today I Learned
실전 프로젝트 5일차. 오늘은 h2에서 mysql aws rds를 적용해서 jmeter로 테스트를 했다. 도중에 LockAcquisitionException이 발생해서 시간을 꽤 오래 잡아먹었지만 비관적lock으로 해결했다. 이 내용은 내일 TIL에 정리해보려 한다.
Spring에서 트랜잭션
- Spring에서는 @Transactional로 트랜잭션을 메서드나 클래스에 구현.
@Transactional의 속성
isolation
: 격리수준을 설정
- Default : 기본격리수준. 대부분의 DB에서는 READ_COMMITTED
- READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 설정 가능.
readOnly
: 데이터를 읽기만 할 때 사용. 읽기 작업 최적화. 여기서 데이터 수정시 예외 발생
rollbackFor
@Transactional(rollbackFor = Exception.class) 처럼 특정 예외 발생시 롤백.
noRollbackFor
@Transactional(noRollbackFor = {IOException.class, TimeoutException.class}
지정한 예외들 발생시엔 롤백 안하도록 설정.
propagation
: @Transactional이 있는 메서드에서 이미 시작된 트랜잭션이 있을 경우 이 트랜잭션을 사용할지, 트랜잭션을 새로 시작할지 지정.
- REQUIRED : 기본값. 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고, 없으면 새로 시작. 자식과 부모에서 롤백이 발생하면 전부 롤백
- REQUIRES_NEW : 항상 새로운 트랜잭션을 시작. 이미 시작된 트랜잭션은 일시 중지.
- SUPPORTS : 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고 없으면 트랜잭션 없이 실행
- MANDATORY : 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고 없으면 예외를 던짐.
- NOT_SUPPORTED : 트랜잭션 없이 실행. 이미 시작된 트랜잭션은 일시 중단.
- NEVER : 트랜잭션 없이 실행. 이미 시작된 트랜잭션이 있으면 예외를 던짐.
- NESTED : 부모 트랜잭션이 존재하면 부모 트랜잭션에 중첩. 없으면 새로 트랜잭션 생성.
부모에 예외 발생시 자식 트랜잭션도 롤백. 하지만 자식에서 예외발생시 부모는 롤백X.