@Transactional (propagación = Propagation.REQUIRED)

107

si alguien puede explicar qué hace esta anotación y cuándo exactamente la usamos:

@Transactional(propagation=Propagation.REQUIRED)

Gracias

Adil
fuente
3
Propagation.REQUIRED es el modo de propagación predeterminado de Transaction, por lo que no es necesario configurarlo explícitamente.
tibtof

Respuestas:

65

Cuando la configuración de propagación es PROPAGATION_REQUIRED, se crea un ámbito de transacción lógica para cada método en el que se aplica la configuración. Cada uno de estos alcances de transacciones lógicas puede determinar el estado de solo reversión individualmente, con un alcance de transacción externo que es lógicamente independiente del alcance de transacción interno. Por supuesto, en el caso del comportamiento estándar PROPAGATION_REQUIRED, todos estos ámbitos se asignarán a la misma transacción física. Por lo tanto, un marcador de solo reversión establecido en el alcance de la transacción interna afecta la posibilidad de que la transacción externa se comprometa realmente (como era de esperar).

ingrese la descripción de la imagen aquí

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

Guido
fuente
166

Si necesita una explicación para laicos del uso más allá de lo que se proporciona en Spring Docs

Considere este código ...

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

Cuando se llama a doSomething (), sabe que tiene que iniciar una transacción en la base de datos antes de ejecutarla. Si la persona que llama de este método ya ha iniciado una transacción, este método utilizará esa misma transacción física en la conexión de base de datos actual.

Esta @Transactionalanotación proporciona un medio de decirle a su código cuando se ejecuta que debe tener una Transacción. No se ejecutará sin uno, por lo que puede suponer en su código que no se quedará con datos incompletos en su base de datos, o tendrá que limpiar algo si ocurre una excepción.

La gestión de transacciones es un tema bastante complicado, por lo que es de esperar que esta respuesta simplificada sea útil

Puntilla
fuente
si está utilizando una configuración basada en proxy para declarar y acceder a la capa DAO, el método en la clase DAO también debe anotarse con @Transactional.
Kurapika
Si ha agregado @Transactionala su capa de servicio, no hay más requisitos para agregar también @Transactionala los métodos DAO que se llaman dentro de esa transacción.
Brad
si doSomething()invoca otro método anidado sin ninguna @transactional, ¿esta misma transacción se aplicará también a ese método de invocación?
thisarattr
Sí, siempre que se utilice el mismo hilo para ejecutar un método anidado (es decir, no crea un nuevo hilo de forma explícita). Esto se debe a que las transacciones de Spring están vinculadas al Thread actual usando variables ThreadLocal
Brad
15

En las aplicaciones Spring, si habilita el soporte de transacciones basadas en anotaciones usando <tx:annotation-driven/>y anota cualquier clase / método con @Transactional (propagation = Propagation.REQUIRED) , Spring framework iniciará una transacción, ejecutará el método y confirmará la transacción. Si se produjo alguna RuntimeException, la transacción se revertirá.

En realidad propagation = Propagation.REQUIRED es el nivel de propagación predeterminado, no es necesario que lo mencione explícitamente.

Para más información: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

K. Siva Prasad Reddy
fuente
5

Para comprender las diversas configuraciones y comportamientos transaccionales adoptados para la gestión de transacciones, como REQUIRED, ISOLATIONetc., deberá comprender los conceptos básicos de la gestión de transacciones en sí.

Lea Gestión de transacciones para obtener más explicaciones.

Mapa de bits
fuente