728x90
트랜잭션이 끝나면 commit이 되면서 객체의 변경사항이 db에 반영된다. 하지만 트랜잭션 중간에 객체가 변하면 어떻게 될까?
중간에 객체가 변하면 바로 flush를 하나? 아니면 트랜잭션이 끝난후 commit과 flush를 할까
@Transactional
public ReqUpdateDocDTO updateDoc(ReqUpdateDocDTO reqUpdateDocDTO/*사용자 정보*/) {
//사용자 정보 토대로 reqUpdateDocDoc.fileName 으로 filepath 찾고 반환
Optional<Documents> findDoc = docRepository.findById(reqUpdateDocDTO.getDocId());
List<String> fileNames = new ArrayList<>();
Documents updateDoc = null;
try {
updateDoc = findDoc.get();
...
updateDoc.updateDoc(reqUpdateDocDTO.getContent(), LocalDate.now()); //변경이 감지되면 바로 flush하나? test해보기
....
}
updateDoc.updateDoc로 중간에 객체의 값이 변경된다.
실행 결과 트랜잭션이 종료된 후에 db에 반영됨
entityManager를 주입해서 flush()를 하면 바로 반영할 수 있다.
하지만 값이 변경되어도 같은 객체로 인식하므로 굳이 flush()를 할 필요가 있을까?
그냥 flush하지 않고 진행하기로 함.
추가로 객체의 값이 변하면 더티체킹으로 감지해서 객체를 변경해주는데 이때 모든 칼럼을 업데이트해준다. 칼럼이 많은 경우는 성능 저하로 이어질 수 있으므로 변경된 값만 변경해 줄 수있도록 해당 엔티티에 @DynamicUpdate를 붙여주자.
728x90