✔ 깃허브 소스코드
✔ Udemy 강의영상
해당 메소드를 트랜잭션으로 감싸줍니다. 해당 메소드가 실행중에 오류 발생시 모든 변경 사항들을 롤백 해줍니다. 모든 변경 사항은 끝까지 정상적으로 실행되고 난 후에 마지막에 데이터베이스에 반영합니다. 그 전에 변경 사항을 반영하려 한다면 entityManager.flush()
를 사용하면 됩니다.
현재 트랜잭션이 관리 중인 모든 엔티티를 저장하는 공간입니다. 트랜잭션이 시작할 때 생성되고 트랜잭션이 끝날 때 제거가 됩니다.
@Test
@Transactional // Persistence Context
public void transactionalTest() {
// Create Persistence Context
// Database Operation 1 - Retrieve student
Student student = entityManager.find(Student.class, 20001L);
// Persistence Context(student)
// Database Operation 2 - Retrieve passport
Passport passport = student.getPassport();
// Persistence Context(student, passport)
// Database Operation 3 - Update passport
passport.setNumber("U98989");
// Persistence Context(student, passport++)
// Database Operation 4 - Update student
student.setName("Alex - updated");
// Persistence Context(student++, passport++)
// Persist to Database
// Kill Persistence Context
}
만약에 @Transactional
어노테이션이 없을 경우, Entity Manager의 연산(Database Operation 1)이 끝날 경우 트랜잭션이 종료되므로 Database Operation 2에서 해당 객체를 참조 할때 에러가 발생하게 됩니다. 즉, read-only
메소드에서 해당 객체와 연관 관계인 객체를 참조할 경우에도 @Transactional
어노테이션을 적용해줘야 합니다.