-
@Transactional 사용시 각각의 메소드에서 영속성을 지님.
-
영속성 cache가 db에 반영되는 시점
- .flush() 사용시
- .save() 사용시 클래스에 @Transactional사용하지 않으면 save에 각각의 @Transactional을 사용하고 있기때문에 바로바로
- Transaction 종료시 (auto commit == auto flush)
- @Transactional을 사용하면서 데이터 변경 후 모든 save후에 마지막에 findAll()을 수행할 경우 auto flush가 되어 db에 적용후에 데이터를 다시 가져옴
-
isolation
- READ_UNCOMMITTED ==> 중간에 데이터가 들어오면 그것도 바뀌기 때문에 사용 x. (데이터 정합성이 발생하기 때문에 사용 하지 않음)
- READ_COMMITTED
- REPEATABLE_READ --> 한 트랜잭션에서 다른데서 commit을 해도 트랜잭션 초기 값만 보여줌.
- SERIALIZABLE --> 최고 등급 isolation 커밋이 일어나지 않은 트랜잭션 존재시 lock을 걸고 웨이팅이 생김. (웨이팅이 생기므로 성능상 잘 사용하지 않음)
-
propagation -> 하나의 메소드와 다른 메소드가 각각의 트랜잭션을 갖고 있기 때문에 그것을 잇기 위해 사용
- REQUIRED --> 기존 사용되던 트랜잭션 사용 없을때만 새로운 트랜잭션( @Transactional 을 사용하지 않은 메소드에서 save 를 할 경우에는 save 하나 하나가 transaction이 되는것)
- REQUIRES_NEW --> 각 트랜잭션이 독립적으로 진행됨. save 처럼
- NESTED --> 하나의 트랜잭션이지만 분리되어 실행 시킬 수 있음 ex) a 트랜잭션 안에 b트랜잭션을 nested로 놓을 경우 b 가 에러가 나면 a는 정상적으로 커밋됨. 하지만 a가 에러가 나면 a,b 모두 커밋되지 않음.
- SUPPORT --> Required랑 비슷하지만 없을때는 새롭게 트랜잭션을 생성하지는 않음
- NOT_SUPPORTED --> 해당 영역은 트랜잭션 없이 실행 되도록 설정.
- MANDATORY --> 필수 적으로 트랜잭션이 존재해야함. 없으면 오류
- NEVER --> 트랜잭션이 없어야함. 있으면 오류
- REQUIRED 을 제외한 것은 지양하여 사용함.