4.1 Hibernate의 트랜잭션 소개
위의 모든 항목에 트랜잭션에 대한 정보를 추가하고 싶습니다. 이미 알고 있듯이 트랜잭션은 모두 함께 수행해야 하는 작업 그룹 입니다 . 작업이 실패했거나 오류와 함께 실행된 경우 다른 모든 작업을 취소해야 합니다.
Hibernate는 두 가지 유형의 트랜잭션으로 작업할 수 있습니다.
- JDBC
- JTA
JDBC 트랜잭션은 실제로 데이터베이스 트랜잭션입니다. 데이터베이스 작업, JDBC 연결에 연결되어 있습니다. 그리고 그는 데이터베이스로 작업할 때 작업이 모두 수행되거나 전혀 수행되지 않도록 합니다.
JTA - 트랜잭션은 애플리케이션 수준 트랜잭션입니다. 어떤 데이터베이스에도 연결되어 있지 않습니다. 그것의 임무는 특정 작업이 수행되는지 확인하는 것입니다: 전부 또는 전혀.
예를 들어 단일 JTA 트랜잭션 내에서 여러 다른 데이터베이스에 데이터를 쓸 수 있습니다. 그런 다음 오류가 발생하면 JTA 트랜잭션은 모든 데이터베이스의 변경 사항을 롤백해야 합니다. 특정 데이터베이스 측면에서 성공적으로 실행된 항목도 마찬가지입니다.
4.2 Hibernate 트랜잭션 인터페이스
Hibernate 라이브러리에서 트랜잭션은 다른 구현을 가질 수 있는 Transaction 인터페이스로 표현됩니다. 예를 들어 Spring으로 작업할 때 Spring은 자체 JTA 트랜잭션 메커니즘을 제공합니다.
이 인터페이스의 메서드는 다음과 같습니다.
| # | 방법 | 설명 |
|---|---|---|
| 1 | 시작하다() | 새로운 거래를 시작합니다 |
| 2 | 저지르다() | 트랜잭션 종료, 모든 변경 사항 푸시/커밋 |
| 삼 | 롤백() | 현재 트랜잭션을 롤백합니다. |
| 4 | setTimeout(int 초) | 최대 트랜잭션 실행 시간 설정 |
| 5 | 활성() | 트랜잭션이 활성 상태인지 여부를 확인합니다. |
| 6 | 롤백() | 트랜잭션이 정상적으로 롤백되었는지 확인 |
| 7 | 커밋됨() | 트랜잭션이 정상적으로 커밋되었는지 확인 |
| 8 | 레지스터동기화() | 트랜잭션을 제어하기 위해 콜백을 등록합니다. |
중요한! 트랜잭션 객체를 생성하는 것과 트랜잭션을 시작하는 것은 서로 다른 두 가지입니다. 여기에서 Thread 클래스와 유추할 수 있습니다. Thread() 객체를 만들 때 JVM은 아직 새 스레드를 시작하지 않습니다. 시작하려면 Thread 개체에서 start() 메서드를 호출해야 합니다. 트랜잭션도 마찬가지입니다. begin() 메서드를 호출해야 합니다.
트랜잭션이 Hibernate에서 일반적으로 처리되는 방법의 예:
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
transaction.begin();
Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
transaction.commit();
}
catch (Exception e) {
if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
transaction.rollback();
}
}
finally {
session.close();
sessionFactory.close();
}
여기서 세 가지를 볼 수 있습니다.
첫째, 데이터베이스에 대한 모든 작업은 메서드를 호출하여 트랜잭션으로 래핑되며 begin()이 commit()두 메서드에 대한 호출 사이의 모든 작업은 모두 함께 수행되거나 아무것도 수행되지 않아야 합니다.
둘째, 오류가 발생하면 트랜잭션을 롤백하려고 시도합니다 rollback(). begin()이는 TransactionManger가 먼저 및 사이에 있는 모든 작업을 기록한 commit()다음 호출한 경우 모든 것을 그대로 반환해야 함을 의미합니다 rollback().
그런데 롤백 메서드를 호출할 때 오류가 발생하지 않는다는 것은 사실이 아닙니다. 실수는 항상 발생합니다. 이 사실을 받아들이고 준비하기만 하면 됩니다.
4.3 트랜잭션 관리자
트랜잭션 관리 관점에서 Hibernate는 JDBC용 경량 개체 래퍼일 뿐입니다. Hibernate 자체에는 트랜잭션 처리 기능이 없습니다. Hibernate 트랜잭션은 실제로 기본 JDBC 트랜잭션(또는 JTA 트랜잭션 래퍼)에 대한 래퍼입니다. JDBCTransaction이 기본값입니다. Hiberante 설정 파일의 예:
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
트랜잭션을 사용하여 코드를 다시 살펴보겠습니다.
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();
이제 JDBCTransaction 클래스 코드를 살펴보겠습니다.
public class JDBCTransaction implements Transaction {
public void begin() throws HibernateException {
...
if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
...
}
}
트랜잭션을 시작하는 방법입니다. 그런 다음 send 메소드를 살펴보십시오.
public void commit() throws HibernateException {
...
jdbcContext.connection().commit();
...
jdbcContext.connection().setAutoCommit( true );
...
}
이제 이 코드를 Hibernate 예제 코드로 대체하자:
| 최대 절전 모드 | 간단한 JDBC 코드 |
|---|---|
|
|
따라서 기본 Hibernate 트랜잭션은 데이터베이스에 대한 기본 JDBC 호출일 뿐입니다. 그 이상도 그 이하도 아닙니다. 그러나 JTA 트랜잭션이 더 흥미롭습니다. 그러나 그것에 대해서는 다른 시간에 더 자세히 설명합니다.
GO TO FULL VERSION