2011-12-02 4 views
8

Grails 웹 응용 프로그램을 사용하면서 Grails 서비스를 사용할 때 이상한 점이 많습니다. Grails 서비스에 대해 더 많이 이해할 수 있도록이 질문을하고 싶습니다. 이것은 나를 위해 (그리고 아마도 다른 사람들을 위해) 도움이 될 것입니다^_ ^). 미리 감사드립니다.Grails 서비스에 대한 몇 가지 질문이 있습니다.

  1. 서비스가 정적 = 트랜잭션 트루 구성하면, 더러워 하이버 네이트 세션에 고정되는 물체와 호출 된 방법 DB 이후에 모든 데이터 변경을 플러시 할 것인가?

  2. static transactional = true 대신 클래스 수준에서 @Transactional 주석을 사용할 수 있습니까? 그리고 그것들을 @Transactional(readOnly = true)을 몇개의 메소드에 넣어 DB로부터 데이터를 읽어 들이고 싶습니다.

  3. 트랜잭션 상속은 어떻습니까? 부모 서비스가 static transactional = true으로 구성되어 있고 하위 서비스에 @Transactional 주석 (클래스)과 일부 @Transactional(readOnly = true) (일부 메소드)이있는 경우 자식에서 부모 메소드를 호출하면 어떻게됩니까?

  4. 트랜잭션은 추상 서비스와 작동합니까? 왜냐하면 내가 아는 바로는 추상 서비스로 빈을 초기화 할 수 없기 때문에 애플리케이션을 시작할 때 Grails 컨텍스트에 약간의 차이가 있기 때문이다./봄 통합이 커밋하기 전에 플러시가 발생되도록 최대 절전 모드 -

답변

7

당신은 질문 당 하나의 질문 : 질문 # 1

, 예를 요청해야합니다. 따라서 save()delete()으로 전화가 걸려서 flush: true을 추가 할 필요가 없습니다. 또한 save()을 호출하지 않은 더티 인스턴스는 discard()을 호출하지 않으면 플러시됩니다.

# 2 : 서비스는 기본적으로 트랜잭션이므로 transactional = true은 실제로 중복되어 있습니다. transactional = false으로 지정하면됩니다. 그러나 생성 된 자동 트랜잭션 래퍼는 @Transactional 주석이없는 경우에만 수행됩니다. 주석이 하나 이상있는 경우 트랜잭션 구분을 정의합니다. 즉, 주석이 없으며 transactional 속성 또는 transactional = true 중 하나가 없습니다. 모든 메소드는 트랜잭션입니다. 그러나 메소드의 서브 세트에만 주석을 달면 트랜잭션 만 처리됩니다.

일반적으로 사용자 정의 전파, 분리, 시간 초과 등과 같이 기본 동작이 아닌 (예 : 사용자의 경우처럼 읽기 전용으로 만들기를 원할 때) 주석을 사용합니다.

클래스 수준에서 모든 메서드에 대해 동일한 구성을 사용하도록 주석을 추가하고 선택적으로 개별 메서드에 주석을 추가하여 클래스 범위 기본값을 재정의 할 수 있습니다.

# 3 및 # 4의 경우 표준 규칙이 적용됩니다 (# 2 참조). 서브 클래스가 주석을 가지고 있다면, 그 클래스 나 부모 클래스의 transactional = true은 무시 될 것입니다. 주석을 사용함으로써 Grails에게 스스로를 구성한다고 말했기 때문입니다.

추상 서비스를 인스턴스화 할 수 없으므로 실제로 인스턴스화 된 구체적인 하위 클래스는 기본 클래스와 자체의 동작을 결합합니다. 모든 것이 transactional = true 인 경우 간단합니다. 주석이 있으면 규칙을 정의합니다.

슈퍼 클래스의 메서드 호출은 현재 클래스의 메서드 호출과 같이 동작합니다. 그러나 Spring의 프록시 접근 방식의 의미를 고려하지 않았다면 약간의 직관적 인 행동을 취할 수 있습니다. 트랜잭션 방식을 호출하면 프록시가 호출을 가로 채서 활성 트랜잭션에 조인하거나 필요한 경우 새 트랜잭션을 시작하거나 REQUIRES_NEW가 지정된 경우 새 트랜잭션을 시작합니다. 하지만 일단 실제 수업을 듣고 다른 방법을 호출하면 프록시를 무시하게됩니다. 따라서 다른 주석 설정으로 다른 메소드를 호출하면 무시됩니다. 그렇게 할 예정이라면이 메일 링리스트 토론에서 진행중인 작업과 그 작업 방법을 확인하십시오. http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html

+0

굉장! 명확한 답변을 해주셔서 고맙습니다. 하지만 역순으로 포인트 3을 살펴 보겠습니다. 부모 서비스 A는 클래스 수준에서 @ 주석으로 표시되고 A에서 doParent() 메소드는 readOnly = true이고 하위 서비스 B에는 트랜잭션에 대한 특정 구성이 없습니다. 왜 내가 B에서 doParent()를 호출합니까? readOnly를 강요하지만 여전히 데이터를 플러시합니까? –

관련 문제