Pergunta

Os documentos da primavera faça um trabalho fantástico ao descrever propriedades de propagação transacional.

No entanto, eu queria saber se há algum exemplo conhecido do mundo real disponível que descreva cada uma dessas propriedades mais detalhadamente em termos leigos.

Foi útil?

Solução

PROPAGATION_REQUIRED

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

Quando doSomething() é chamado, ele iniciará uma nova transação se o chamador ainda não tiver iniciado uma transação.

Se o chamador deste método já tiver iniciado uma transação, então a transação do chamador será usada e nenhuma nova transação será criada (ou seja,há uma transação em jogo).

Se uma exceção for lançada dentro de doSomething() então ela será revertida, o que significa que o chamador também verá a transação revertida.

Quando doSomething() retornar, a transação ainda não terá sido confirmada.É o chamador que confirmará a transação (ou possivelmente a reverterá).

PROPAGATION_REQUIRES_NEW

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

Quando doSomething() é chamado, ele irá sempre iniciar uma nova transação.

Se o chamador deste método já iniciou uma transação (TxnOuter), então a transação do chamador é suspenso e uma nova transação (TxnInner) é criada (ou seja,há duas transações em jogo).

Se uma exceção for lançada dentro de doSomething() então TxnInner será revertido, mas a transação "suspensa" do chamador (TxnOuter) não será afetada.

Quando doSomething() retornar sem uma exceção, ele confirmará a transação (TxnInner).A transação do chamador (TxnOuter) será retomada e não terá conhecimento de que outra transação foi confirmada.O chamador pode então confirmar ou reverter TxnOuter conforme achar adequado.

O ponto importante a ser observado é que o Banco de Dados vê TxnOuter e TxnInner como transações completamente independentes e, portanto, dois commits independentes.

PROPAGATION_NESTED

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

NESTED só pode ser usado se o seu driver JDBC e/ou banco de dados suportar Pontos de salvamento JDBC

Quando doSomething() é chamado, ele iniciará uma nova transação se o chamador ainda não tiver iniciado uma transação.

Se o chamador deste método já tiver iniciado uma transação, então a transação do chamador será usada e nenhuma nova transação será criada (ou seja,há uma transação em jogo).No entanto, um "ponto de salvamento" é marcado na transação quando doSomething() é inserido.

Se uma exceção for lançada dentro de doSomething() então a transação pode ser parcialmente revertida para o "ponto de salvamento".O chamador continuará com a transação.

Quando doSomething() retorna sem uma exceção, é o chamador quem confirmará a transação inteira (ou reverterá).

O ponto importante a ser observado é que o banco de dados visualiza apenas uma transação e há apenas um commit.

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