Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영
dirty - 변경된 부분을 의미
영속성 컨택스트(Persistence Context) 안에 있는 엔티티
Service Layer에서 @Transactional을 사용하는 경우
@Service
public class ExampleService {
@Transactional
public void updateInfo(Long id, String name) {
User user = userRepository.findById(id);
user.setName(name);
}
}
EntityTransaction을 이용해서 트랜잭션을 범위를 지정하고 사용하는 경우
@Service
public class ExampleService {
public void updateInfo(Long id, String name) {
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
// 1. 트랜잭션 시작
tx.begin();
// 2.User 엔티티를 조회 & User 스냅샷 생성
User user = em.find(User.class, id);
// 3.User 엔티티의 name을 변경
user.setName(name);
// 4. 트랜잭션
// 5.User 스냅샷과 최종 user의 내용을 비교해서 Dirty를 Checking 해서 Update Query 발생
tx.commit();
}
}
위 1번/2번에서 더티 체킹이 일어나면 user의 업데이트에 대한 메서드를 호출하지 않았음에도 불구하고 Query가 발생
트랜잭션 커밋 이후, 트랜잭션이 끝나는 시점에 모든 엔티티에 대한 정보를 DB에 반영