2011-12-23 20 views
6

La situación es la siguiente:transacción Primavera partes internas

  1. Método1 tiene cuatro métodos de actualización de base de datos en el mismo. El Método1 se anota utilizando la semántica de gestión de transacciones de Spring.

  2. Method2 tiene un método de lectura de base de datos y se invoca después de que Method1 ha terminado de ejecutar todas sus actualizaciones de base de datos. Method2 también se anota utilizando la semántica de transacciones de Spring.

  3. Hay una solicitud web que entra, el controlador intercepta la solicitud e invoca el método1 y luego el método2.

  4. Una transacción se envuelve alrededor de la solicitud web también.

Lo que interesa saber es:

1.How sabe primavera para confirmar las actualizaciones de bases de datos en una transacción exitosa? ¿Hay alguna referencia a la implementación de Spring que haga la gestión de transacciones?

2. Dado que tenemos una jerarquía de transacciones: Transacción alrededor de la web-solicitud-> Transacción con propagación = Solicitud nueva para Método1-> Transacción con propagación = Requerido para Método2, ¿cómo hace Spring la gestión de transacciones para garantizar el las transacciones se ejecutan dentro del contexto adecuado con el orden correcto?

En resumen, será genial obtener una cuenta de juego a juego de cómo Spring realiza la gestión de transacciones en todos sus detalles más sutiles o una referencia a la documentación que no simplemente agita a mano una explicación centrada en JTA o alguna otro acrónimo

Gracias

Respuesta

7

Permite hacer algunas declaraciones básicas.

  1. Un contexto transaccional es un entorno donde algunas propiedades especiales (sesión de la base de datos) están disponibles para el tiempo de ejecución de la aplicación que de otro modo no estarían disponibles. Un contexto de transacción generalmente se usa para determinar el alcance de una transacción.
  2. Spring usa, AOP Proxies y metadatos XML para lograr una gestión de transacciones declarativa.
  3. Las anotaciones se utilizan para marcar el comportamiento de Propagación de transacción de un método en particular.
  4. Spring usa Interceptor Mechanism para aplicar la transacción sobre los métodos.

Aquí estoy reutilizando el ejemplo anterior da por @stacker

MyClass{ 

    @Transactional 
    public void sequence() { 
     method1(); 
     method2(); 
    } 

    @Transactional 
    void method1() { 
    } 

    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    void method2() { 
    } 

} 

También puede conseguir la misma funcionalidad utilizando la configuración de XML también. Tomemos esto como su popular y ampliamente utilizado.

En el momento de despliegue

  • framework Spring comprueba los archivos de configuración xml (famosa applicationContext.xml) y dependiendo de la configuración, escanea el código para @Transactional anotación (suponiendo que la configuración se menciona como la anotación de base).
  • Después de esto, genera proxies AOP para los métodos marcados para la transacción. En términos simples, estos proxies no son más que envoltorios alrededor de los métodos involucrados.
  • Dentro de estos métodos de envoltura, antes y después de también se genera el código del Asesor de transacciones según la configuración (es decir, la propagación de la transacción).
  • Ahora, cuando se invocan estos métodos de contenedor Transacción Asesor entra en la imagen antes y después de la llamada al método real. .
  • En representación de la misma en pseudo código para el ejemplo anterior

    ProxyMyClass{ 
        MyClass myclass; 
        . 
        . 
        . 
        sequence(){ 
        //Transaction Advisor code (Typically begin/check for transaction) 
        myclass.sequence(); 
        //Transaction Advisor code(Typically rollback/commit) 
        } 
        . 
        . 
        . 
        } 
    

Esto es cómo los gerentes de primavera la transacción. Sin embargo, una ligera simplificación excesiva.

Ahora para responder a sus preguntas,

.How sabe primavera para confirmar las actualizaciones de bases de datos en una transacción exitosa? ¿Hay alguna referencia a la implementación de Spring que haga la gestión de transacciones?

Siempre que llame a un método bajo transacción, realmente llama a un proxy que primero ejecuta el asesor de transacción (que iniciará la transacción), luego llama al método de negocio real, una vez que se completa, se ejecuta otro asesor de transacción (que dependiendo del método de camino devuelto, se comprometerá o revertirá la transacción).

Dado que tenemos una jerarquía de transacciones: Transacción alrededor de la web-solicitud-> Transacción con propagación = SolicitudNuevo para Método1-> Transacción con propagación = Requerido para Método2, ¿cómo hace Spring la gestión de transacciones para garantizar que las transacciones ejecutado dentro del contexto adecuado con el orden correcto?

En el caso de la jerarquía de transacción, el marco de resorte genera los controles Transacción Advisor en consecuencia. Para el ejemplo que mencionas,

  • para method1 (RequestNew) El código de Transaction Advsor (o Transaction Advice) sería crear siempre una nueva transacción.
  • para el código metodo2 (Obligatorio) Asesor de Transacción (o consejos transacción) sería comprobar la transacción existente y utilizar la misma si existe o bien crear una nueva transacción.

Hay un image on the spring documentation page que muy bien resume estos aspectos.

Typical Spring Transaction Management

Espero que esto ayude.

+0

, esta fue una explicación increíble. Gracias –

+0

¿Puede explicar si en el diagrama anterior la persona que llama es un controlador o una solicitud web? – tintin

+0

@tintin, no importa si la persona que llama es el controlador o cualquier otra cosa. Al final será una llamada de método de alguna clase a proxies. – Santosh

4
Controller 
@Transactional 
public void sequence() { 
    method1(); 
    method2(); 
} 

@Transactional 
void method1() { 
} 

@Transactional(propagation=Propagation.REQUIRES_NEW) 
void method2() { 
} 

La propagación por defecto es necesario (Apoyo a una transacción actual, crear uno nuevo si no existe ninguno.) Por lo tanto m1 utilizará la transacción iniciada en el controlador. m2 se anota como REQUIRES_NEW (Crea una nueva transacción, suspende la transacción actual, si es que existe). El orden de la transacción es el orden que llamas los métodos transaccionales.

Controller 
begin tx1 
    |--------------------> m1 (uses tx1) 
    | 
    | begin tx2 
    |--------------------> m2 (uses tx2) 
    | commit tx2 
commit tx1 
+0

En un entorno MVC típico, ¿la transacción comienza en el nivel del controlador? o comienza en servicio con la anotación @Transactional que invoca el controlador? – tintin

+0

@tintin Si tiene servicios de "bajo nivel", puede combinarlos con diferentes transacciones (para diferentes acciones), por lo tanto, debe iniciar las transacciones en su controlador. Un método anotado con Transactional se une a una transacción existente (por ejemplo, (iniciado en un controlador) – stacker

0

¿Has leído el Spring documentation? Básicamente, AOP se usa para administrar la transacción. También debe leer AOP documentation. Si la documentación de AOP no es suficiente, le sugiero que revise el código. Pasar por el código en modo de depuración con punto de interrupción sería bueno.

Cuestiones relacionadas