데이터베이스에서 객체를 가져올 때 JPA(Hibernate)가 트랜잭션을 처리하는 방법

StackOverflow https://stackoverflow.com/questions/245723

문제

저는 현재 지속성 관리자로 Hibernate를 사용하고 지속성 관리 최대 절전 모드의 추상화로 JPA를 사용하여 Java에서 애플리케이션을 개발 중입니다.

트랜잭션 주위에 결과 쿼리를 래핑할 때의 영향을 알고 싶습니다.나는 엔터티 관리자가 느리게 가져온 필드 버그를 위해 열려 있어야 한다는 것을 알고 있습니다. 이 모든 것의 트랜잭션은 어떻습니까?

다음은 트랜잭션 활성화/비활성화 기능이 포함된 코드 예제입니다.

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

이 함수가 호출될 때 withTransaction을 활성화하거나 비활성화하는 것의 차이점은 무엇입니까?

감사합니다, 프레드

도움이 되었습니까?

해결책

데이터를 변경하지 않으므로 여기에는 실질적인 차이가 없습니다.실행하는 쿼리는 SQL 선택을 생성합니다.트랜잭션은 삽입, 업데이트 등의 컬렉션에 ACID 속성을 적용할 수 있도록 하기 위해 존재합니다.

하지만, 이 메소드에서 반환된 목록의 객체 조작, setter 호출 등을 시작하는 경우이러한 변경 사항은 임시 트랜잭션을 통해 데이터베이스로 다시 전파됩니다.즉, 자동 커밋 모드에서 DB를 효과적으로 작업하게 됩니다.이것은 당신이 원하는 것이 아닐 것입니다.

이해해야 할 중요한 점은 지속성 컨텍스트와 트랜잭션의 지속 시간을 별도로 관리할 수 있다는 것입니다.종종 함께 관리하고 싶을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top