2012-05-24 34 views
60

si alguien puede explicar lo que hacer esta anotación y el momento exacto en que lo utilizan:@Transactional (propagación = Propagation.REQUIRED)

@Transactional(propagation=Propagation.REQUIRED) 

Gracias

+2

¿Has leído esto? http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#tx-propagation – Brad

+3

Propagation.REQUIRED es el modo de propagación predeterminado de Transaction, por lo que no necesita establecerlo explícitamente. – tibtof

Respuesta

47

Cuando el ajuste de propagación es PROPAGATION_REQUIRED, una operación lógica El alcance se crea para cada método sobre el que se aplica la configuración. Cada alcance de transacción lógica de este tipo puede determinar el estado de retrotracción individualmente, con un alcance de transacción externo que es lógicamente independiente del alcance de la transacción interna. 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 retroceso solo establecido en el alcance interno de la transacción afecta la posibilidad de la transacción externa de comprometerse realmente (como era de esperar).

enter image description here

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

11

En las aplicaciones de la primavera, si se habilita el soporte de transacciones basadas anotación utilizando <tx:annotation-driven/> y anotar cualquier clase/método con @Transactional (propagación = Propagation.REQUIRED) continuación framework Spring comenzará una transacción y ejecuta el método y confirma la transacción. Si se produce una excepción RuntimeException, la transacción se retrotraerá.

En realidad propagation = Propagation.REQUIRED es el nivel de propagación por defecto, no necesita mencionarlo 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

2

Para comprender los diferentes ajustes de transacciones y comportamientos adoptados para la gestión de transacciones, tales como REQUIRED, etc. ISOLATION que tendrá que entender los conceptos básicos de la propia gestión de transacciones.

Lea Trasaction management para obtener más información sobre la explicación.

104

Si necesita una explicación del uso laymans allá de lo previsto en el Spring Docs

Considere este código ...

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

Cuando doSomething() se llama que sabe que tiene que iniciar una transacción en la base de datos antes de ejecutar. 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 la base de datos actual.

Esta anotación @Transactional proporciona un medio para indicar 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 le quedarán datos incompletos en su base de datos, o tendrá que limpiar algo si ocurre una excepción.

gestión de transacciones es un tema bastante complicado, así que espero que esta respuesta simplificada es útil significa

+1

hombre demasiado impresionante, gracias a la gran orientación .. –

+2

Si a alguien le interesa, he publicado [respuesta de un laico similar al comparar PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED, PROPAGATION_REQUIRED] (http://stackoverflow.com/questions/25076718/spring-propagation-examples -in-laymans-terms/25083505 # 25083505) – Brad

+0

si usa una configuración basada en proxy para declarar y acceder a la capa DAO, el método en la clase DAO también debe ser anotado con @Transactional. – Kurapika

8

primavera REQUIRED comportamiento que el same transaction se utilizará si hay un ya abierto transacción en el contexto de ejecución del método del Bean actual . Si hay ninguna transacción existente el contenedor de resorte será creará uno nuevo. Si se llaman múltiples métodos configurados como REQUIRED de forma anidada, se les asignarán distintas transacciones lógicas, pero todos ellos compartirán la misma transacción física. En resumen, esto significa que si un método interno hace que una transacción se retrotraiga, el método externo no podrá confirmar y también revertirá la transacción

Cuestiones relacionadas