programing

@Transactional with JPA and Hibernate의 사용법은 무엇입니까?

abcjava 2023. 3. 7. 20:58
반응형

@Transactional with JPA and Hibernate의 사용법은 무엇입니까?

JPA와 휴지 상태 및 MySQL 데이터베이스를 사용하여 REST API를 작성하는 방법을 배우고 있는데 @Transactional 주석을 봅니다.누가 이 주석의 용도를 설명해 줄 수 있나요?

예를 들어 다음과 같은 간단한 DAO 클래스가 있습니다.

@Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO {

    // define field for entitymanager
    private EntityManager entityManager;

    // set up constructor injection
    @Autowired
    public EmployeeDAOHibernateImpl(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public List<Employee> findAll() {

        // get the current hibernate session
        Session currentSession = entityManager.unwrap(Session.class);

        // create a query
        Query<Employee> theQuery = 
                currentSession.createQuery("from Employee", Employee.class);

        // execute query and get result list
        List<Employee> employees = theQuery.getResultList();

        // return the results
        return employees;
    }

}

findAll() 메서드에 사용되는 @Transactional이 표시됩니다만, 이 @Transactional을 삭제해도 같은 출력이 표시됩니다.그럼 이 @Transactional의 용도는 무엇입니까?

@Transactional주석은 트랜잭션에서 특정 메서드/클래스(=내부 모든 메서드)를 실행할 때 사용됩니다.

사용자라고 가정합니다.A100달러를 사용자에게 전송하려고 합니다.B. 어떤 일이 일어나는지:

  1. A의 어카운트를 100달러 감액합니다.
  2. 우리는 B의 계정에 100달러를 추가한다.

성공 후 예외가 발생한다고 가정합니다.1)실행 전2)이제 우리는 어떤 모순을 가지게 될 것이다 왜냐하면A100달러 분실B아무것도 없어요거래는 전부 또는 무를 의미합니다.메서드의 어딘가에 예외가 있는 경우 변경은 데이터베이스에서 유지되지 않습니다.라고 하는 것rollback일어난다.

지정하지 않으면@Transactional각 DB 콜은 다른 트랜잭션으로 처리됩니다.

일반적으로는@Transactional주석은 서비스 수준에서 작성됩니다.

데이터베이스에 있는 개 이상의 쓰기를 단일 원자 연산으로 결합하기 위해 사용됩니다.

누군가가 주석을 단 메서드를 호출할 때@Transactional 데이터베이스쓰기가 모두 또는 전혀 실행되지 않습니다.

읽기 작업의 경우 유용하지 않으므로 단일 원자 쓰기인 경우 유용합니다.1회 읽기(선택)로 사용하고 있기 때문에 추가 또는 삭제한다.@Transactional주석은 영향을 주지 않습니다.

클래스가 선언합니다.@TransactionalSpring은 자체 또는 해당 멤버에 대해 주석을 다는 클래스와 동일한 인터페이스를 구현하는 프록시를 만듭니다., 봄은 콩을 대신 싸서자체는 전혀 알지 못한다.

프록시는 Spring이 메서드 호출의 전, 후 또는 주변 동작을 프록시 대상 객체에 주입하는 방법을 제공합니다.

내부적으로는 트랜잭션어드바이스(AOP 사용)를 사용하는 것과 같습니다.이 어드바이스에서는 프록시가 먼저 생성되고 타겟빈의 메서드 전후에 호출됩니다.

에는 ""가 되어 있습니다.TransactionInterceptor이치노?@Transactional인 '됩니다.TransactionInterceptor는 프록시 객체에서 먼저 호출되며 트랜잭션이 시작되고 최종적으로 타깃빈에서 메서드가 호출됩니다.되면, 「」는TransactionInterceptor에 따라

언급URL : https://stackoverflow.com/questions/54326306/what-is-the-use-of-transactional-with-jpa-and-hibernate

반응형