2013-07-06 3 views
8

최대 절전 모드 docs 쇼 예 :최대 절전 모드 읽기 전용 트랜잭션

session = sessionFactory.openSession(); 
session.beginTransaction(); 
List result = session.createQuery("from Event").list(); 
for (Event event : (List<Event>) result) { 
    System.out.println("Event (" + event.getDate() + ") : " + 
     event.getTitle()); 
} 
session.getTransaction().commit(); 
session.close(); 

왜 이벤트 목록은 단순히 인쇄 된 경우에도 session.getTransaction().commit()을 수행하는 것이 필요하다?

답변

11

SELECT 또한 거래가 필요합니다. 트랜잭션없이 SELECT를 수행하는 것은 불가능합니다. 일부 SQL GUI 도구를 사용하여 DB에서 데이터를 선택할 때 트랜잭션을 명시 적으로 시작하고 종료 할 필요가 없다는 점은 이러한 도구가 autocommit 모드를 사용하고 있다는 것입니다. 자동 커밋 모드에서 데이터베이스는 트랜잭션 경계를 명시 적으로 선언 할 필요가 없도록 각 단일 SQL 문에 대한 트랜잭션을 자동으로 시작하고 커밋합니다.

트랜잭션을 종료 (즉, 커밋 또는 롤백)하지 않으면이 트랜잭션에서 사용하는 데이터베이스 연결이 해제되지 않고 결국 데이터베이스에서 사용 가능한 연결이 모두 소모됩니다.

최대 절전 모드의 경우 기본적으로 비 자동 커밋 모드 (hibernate.connection.autocommit 속성으로 지정)를 사용합니다. 따라서 트랜잭션 경계를 선언하고 트랜잭션이 종료되는지 확인해야합니다.

하지만 단지 쿼리 데이터가 최대 절전 API를 사용하는 경우, 그것은 심지어 명시 적 때문에 다음의 트랜잭션 경계를 선언하지 괜찮 :

  1. 데이터베이스는 일반적으로 자동으로 새 트랜잭션을 시작합니다 현재 SQL 문을 사용하려면 트랜잭션이 명시 적으로 시작되어야합니다. java.sql.Connection#close()가 호출되면

  2. Session.close()에서, JDBC 스펙에 기초 Connection .According을 close()되고 활성 트랜잭션이 있고,이 활성 트랜잭션의 결과는 JDBC 벤더의 구현에 의존한다. 일반적으로 JDBC 드라이버는이 트랜잭션을 자동으로 커밋하거나 롤백합니다. 그러나이 경우에는 이미 원하는 데이터를 얻었 기 때문에 트랜잭션이 커밋되거나 롤백되는지 여부는 중요하지 않습니다.

+0

답변 해 주셔서 감사합니다. –

관련 문제