@Transactional (propagation = Propagation.REQUIRED)

107

se alguém puder explicar o que esta anotação faz e quando exatamente a usamos:

@Transactional(propagation=Propagation.REQUIRED)

obrigado

Adil
fonte
3
Propagation.REQUIRED é o modo de propagação padrão de Transaction, então você não precisa defini-lo explicitamente.
tibtof

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

Guido
fonte
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

Brad
fonte
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

K. Siva Prasad Reddy
fonte
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.

Bitmap
fonte