2014-01-23 3 views
13

@Transactional 주석없이 트랜잭션을 관리 alertDAO 구현은 다음과 같습니다.봄은 내가 지금처럼 내 트랜잭션을 관리하는 봄 주석을 사용하고

import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

// no annotation here either 
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO { 

    public List<Alert> getAlerts(){ 
     // some implementation details that define queryString 

     Query query = getSession().createQuery(queryString); 
     List<Alert> alerts = query.list(); 

     return alerts; 
    } 

} 

데이터를 가져올 수있는 것처럼 보입니다. 주석 없이도 데이터베이스에서.

이런 부주의의 결과는 무엇이며 일어날 수있는 최악의 시나리오는 무엇입니까?

+1

질문에 대해서는 세션 유출이 발생할 수 있습니다. 즉, 트랜잭션 경계가 없기 때문에 세션이 열리지 만 닫히지 않습니다 (스프링이 세션을 열고 닫는 데 사용함). 당신의 DA는 결함이있다. 당신은 HibernateDaoSupport 클래스에서 getSession을 호출해서는 안된다 (이것은 관리되지 않는 세션을 열 것이다). ('HibernateTemplate'과'HibernateDaoSupport'는 2006 년 어딘가에서 Hibernate 3.0.1에서 deprecated로 간주되어야합니다!). http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-hibernate-straight를 참조하십시오. –

+1

기본적으로 트랜잭션 경계는 서비스 호출이 반환하거나 서비스 스레드 (웹 응용 프로그램의 경우)가 MVC 요청을 반환하는 위치가 아닌가? 비 웹 응용 프로그램 시나리오 인 경우 세션 유출이 큰 문제입니다. 그러나 그것이 존재하는 경우 현재 세션을 리턴 할 getSession()을 항상 호출하므로 그렇지 않습니까? 스레드 로컬에 저장되었으므로? –

+0

@ M.Deinum은 http://stackoverflow.com/questions/42831749/hibernate-session-with-spring-transaction에서 비슷한 질문으로 의견을 제공 할 수 있습니까? – emilly

답변

7

문서 (Spring docs)에 따르면 메소드 또는 인터페이스가 '거래 상 인식'(즉, <tx:annotation-driven/>)으로 구성 될 수 있음을 나타내는 메타 데이터 일뿐입니다. 와

단지 텍사스 : 주석 중심의 내가 너희를 적용 "기본"트랜잭션 특성받을 생각없이 @Transactional 속성 :

  • 전파 설정은 필수입니다.
  • 격리 수준은 입니다. 기본값은입니다.
  • 트랜잭션이 읽기/쓰기입니다.
  • 트랜잭션 시간 초과는 기본 트랜잭션 시스템의 기본 시간 초과를 기본값으로하며, 시간 초과가 지원되지 않는 경우는 없습니다.
  • 임의 RuntimeException은 롤백을 트리거하고 임의의 체크 예외은 그렇지 않습니다. 당신은 트랜잭션 관리를 통해 운전하는 <tx:annotation-driven />를 사용하는 가정

다음 @Transactional 속성이 readOnly 인, 분리, 전파, rollbackFor과 같은 속성을 적용 할 수 없음을 의미 놓치게 , noRollbackFor

나는 MVC가 약간 다르다고 믿는다 - Hibernate 세션은 MVC 요청에 직접적으로 묶여있다. 즉, 요청이 trans 행동이 시작됩니다. 다음과 같이 위로 예

는 HibernateDaoSupport를에 대해 getSession()에 대한 코드는 다음과 같습니다

protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException 
{ 
    return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

차례로 호출되는 : 궁극적에 호출

/** 
* Obtain a Hibernate Session, either from the current transaction or 
* a new one. The latter is only allowed if "allowCreate" is true. 
*....... 
*/ 
protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException { 
    return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

:

/** 
* .... 
* @param allowCreate whether a non-transactional Session should be created 
* when no transactional Session can be found for the current thread 
* .... 
*/ 
private static Session doGetSession(
    SessionFactory sessionFactory, Interceptor entityInterceptor, 
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate) 

기본적으로 트랜잭션 : Sess ion은 1 : 1 AFAIK로 묶여 있으며, 트랜잭션없이 실행하는 유일한 방법은 JBoss에 '구운 (baked in)'지속성 계층을 사용하여 트랜잭션을 제공하는 것입니다 (표지 아래 있음). getSession() 이후에 getQuery()으로 전화를 걸더라도 JDBC/최대 절전 모드 연결로 인해 트랜잭션이 효과적으로 발생합니다.

0

기본적으로 @transactional Annotation을 넣지 않으면 아무 일도 일어나지 않습니다. @Transactional은 메소드 서명의 맨 위에 놓아야하는 것은 아닙니다. 트랜잭션이 읽기 전용 = true 일 때 컴파일러에 알리기 위해 사용됩니다 (데이터 검색에만 해당). 목적) 및 읽기 전용 일 때만 false (삽입 업데이트 삭제 작업에만 해당)

1

주석이 없으면 롤백과 같은 트랜잭션의 이점을 잃게됩니다.

@Transactional 어노테이션을 사용하면 많은 삽입 작업과 하나의 작업과 같이 하나 이상의 데이터베이스 작업을 수행하므로 트랜잭션의 모든 작업을 롤백하여 데이터에 일관성을 부여 할 수 있습니다.

그래서 DAO가 아닌 서비스에 주석을 추가하는 것이 좋습니다.

+0

"롤백 또는 트랜잭션 없음"? 아니요 - 아직 체크되지 않은 예외 RTE 파생물에 대해서는 롤백이 있으며 spring-config로 구성되었거나 Spring 기본값으로 제공된 트랜잭션은 무엇입니까? –

+0

선언적 트랜잭션 관리를 사용하는 경우 물론 롤백이 작동하는 방식에는 영향을주지 않지만 주석에서 독점적으로 의존하는 경우 데이터베이스 작업 세트의 작동 방식에 영향을 미칩니다. – pfernandom

0

귀하의 시나리오에서 DAO는 트랜잭션없이 실행되며, 대부분 자동 커밋됩니다.

당신은 당신이 @Transactional 주석을 다음과 같이 DAO 계층을 보호 할 수있는 트랜잭션에서 실행하는 미래에 이러한 종류의 실수를 피하기 위해 원하는 모든 서비스를 필요로하는 경우 :

@Transactional(propagation = MANDATORY) 
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO { 
    ... 
} 

이 주석은 트랜잭션을 선언하는 서비스 계층이 필요합니다 그렇지 않은 경우는 예외를 throw합니다.

관련 문제