Pergunta

Eu estou trabalhando com uma aplicação web Grails e eu recebo tantas coisas estranhas quando se utiliza o serviço Grails. Então, eu quero fazer algumas perguntas sobre isso para me fazer entender mais sobre os serviços Grails. Isso será muito útil para mim (e talvez para outros ^ _ ^). Desde já, obrigado.

  1. Se um serviço estiver configurado com transacional estática = verdadeiro, ele irá liberar cada alterações de dados para DB após qualquer método de invocação com um objeto que está sujo e que está sendo bloqueado em sessão Hibernate?

  2. Posso usar @Transactional anotação no nível de classe em vez de static transactional = true? E é possbile para colocar @Transactional(readOnly = true) em alguns métodos que eu só quero que eles para ler (consulta, encontrar) dados de DB?

  3. Como sobre a herança transação? Quero dizer que, se o serviço pai está configurado static transactional = true, eo serviço criança tem seu próprio anotação @Transactional (na classe) e alguns @Transactional(readOnly = true) (em alguns métodos), o que vai acontecer se eu chamar um método no pai daquela criança?

  4. O trabalho transacional com um serviço abstrato? Porque, como eu sei, com serviço abstrato que não pode inicializar o seu feijão, e talvez ao iniciar aplicativo, existem algumas diferenças de contexto Grails.

Foi útil?

Solução

Você deve perguntar a uma pergunta por pergunta:)

Para a pergunta # 1, sim - os garante a integração Primavera / Hibernate que um flush acontece antes da submissão. Portanto, chamadas para save() e delete() vai ficar corada e não há necessidade de adicionar flush: true para qualquer um. Além disso, casos sujos que você não tenha chamado save() on também será liberado a menos que você chamar discard().

Para # 2: Serviços são transacionais por padrão, portanto transactional = true é realmente redundante - você só precisa especificar dizer transactional = false. Mas o wrapper transação automática que é criado só é feito se não houver anotações @Transactional. Se você tiver um ou mais anotações, em seguida, aqueles que definem a demarcação da transação. Então, por padrão (ou seja, há anotações e quer nenhuma propriedade transactional ou transactional = true) Todos os métodos são transacional, mas se você só anotar um subconjunto dos métodos, em seguida, apenas aqueles será transacional.

Normalmente, você usaria anotações quando você quer um comportamento não-padrão, ou seja, a propagação costume, isolamento, tempo limite, etc. (ou torná-lo somente leitura como no seu exemplo).

É possível anotar ao nível da classe a ter a mesma configuração de todos os métodos de, e opcionalmente anotar métodos individuais para substituir os padrões classe de escopo.

Para # 3 e # 4, as regras normais se aplicam (ver # 2). Se a subclasse tem anotações, então transactional = true de classe ou uma classe pai seria ignorado uma vez usando as anotações que você disse Grails que você está configurando as coisas sozinho.

Uma vez que os serviços abstratas não pode ser instanciado, a subclasse concreta de que está realmente instanciado vai ter combinado o comportamento da classe base e ela própria. Se tudo estiver transactional = true então é simples, e se você tiver quaisquer anotações, em seguida, eles definem as regras.

métodos chamado na superclasse iria se comportar apenas como chamar métodos na classe atual. Mas o comportamento é um pouco contra-intuitivo, se você não considerar as implicações da abordagem de proxy do Spring. Quando você chamar um método transacional, os proxy intercepta a chamada e se junta a transação ativa, ou começa um novo se necessário, ou começa um novo se REQUIRES_NEW é especificado. Mas uma vez que você está na classe real e chamar um outro método, você vai ignorar o proxy. Então, se você chamar um outro método com diferentes configurações de anotação, eles vão ser ignorado. Se você estiver indo para fazer isso, consulte esta lista de discussão de discussão para o que está acontecendo e como trabalhar com ele: http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top