@Transactional (propagation = Propagation.REQUIRED)


Respostas:


65

Quando a configuração de propagação é PROPAGATION_REQUIRED, um escopo de transação lógica é criado para cada método no qual a configuração é aplicada. Cada um desses escopos de transação lógica pode determinar o status somente de rollback individualmente, com um escopo de transação externo sendo logicamente independente do escopo de transação interno. É claro que, no caso do comportamento padrão de PROPAGATION_REQUIRED, todos esses escopos serão mapeados para a mesma transação física. Portanto, um marcador apenas de reversão definido no escopo da transação interna afeta a chance da transação externa de realmente confirmar (como você esperaria).

insira a descrição da imagem aqui

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

Se você precisar de uma explicação leiga sobre o uso além da fornecida no Spring Docs

Considere este código ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Quando doSomething () é chamado, ele sabe que deve iniciar uma transação no banco de dados antes de executar. Se o chamador desse método já iniciou uma Transação, este método usará a mesma Transação física na conexão de banco de dados atual.

Essa @Transactionalanotação fornece um meio de informar ao seu código quando ele é executado que ele deve ter uma Transação. Ele não será executado sem um, portanto, você pode fazer essa suposição em seu código de que não ficará com dados incompletos em seu banco de dados ou terá que limpar algo se ocorrer uma exceção.

Gerenciamento de transações é um assunto bastante complicado, então espero que esta resposta simplificada seja útil



se estiver usando a configuração baseada em proxy para declarar e acessar a camada DAO, o método na classe DAO também deve ser anotado com @Transactional.
Kurapika de

Se você adicionou @Transactionalà sua camada de serviço, não há mais requisitos para adicionar também @Transactionalaos métodos DAO que estão sendo chamados dentro dessa transação.
Brad de

se doSomething()invoca um outro método aninhado sem nenhum @transactional, essa mesma transação se aplicará a esse método de invocação também?
thisarattr

Sim, desde que o mesmo Thread esteja sendo usado para executar um método aninhado (ou seja, você não cria um novo Thread explicitamente). Isso ocorre porque as transações do Spring são vinculadas ao Thread atual usando variáveis ​​ThreadLocal
Brad

15

Em aplicativos Spring, se você ativar o suporte a transações baseadas em anotação usando <tx:annotation-driven/>e anotar qualquer classe / método com @Transactional (propagation = Propagation.REQUIRED) , o framework Spring iniciará uma transação e executará o método e confirmará a transação. Se ocorrer alguma RuntimeException, a transação será revertida.

Na verdade, propagation = Propagation.REQUIRED é o nível de propagação padrão, você não precisa mencioná-lo explicitamente.

Para mais informações: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

Para entender as várias configurações e comportamentos transacionais adotados para o gerenciamento de transações, como REQUIRED, ISOLATIONetc. , você terá que entender os fundamentos do próprio gerenciamento de transações.

Leia Gerenciamento de tração para obter mais explicações.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.