Los escenarios de aplicación reales surgen asuntos multiproceso

Hola a todos, soy un pato:

Hoy en día es la proporción real de escenarios de aplicación multiproceso primavera Asuntos:

Anterior habló sobre el principio, sobre todo para el inicio y la ejecución de la transacción (enlace de base de datos, los niveles de aislamiento, ThreadLocal hilo determinada).
https://blog.csdn.net/Angry_Mills/article/details/82502288

 

La siguiente desde un punto de análisis práctico.

El siguiente código de demostración escena Dirección:

https://gitee.com/fireduck_admin/demo-mutithread.git

1. escenarios de simulación   

   1.1 Método no añadió anotación transaccional, maestro transacción hilo nuevo Thread realización de la presentación de
    la rosca principal y la transacción hilo hijo presentado por separado (hilo hijo presentó hilo principal presentó)
    1,2 plus transaccional anotación autor transacción hilo maestro nuevo Thread realización de la caso en el que
    el hilo principal y un sub asuntos de hilo presentado con

    Consideremos el siguiente anotada única manera la situación
    1.3 el hilo principal de hilo hijo normal, anormal 
    sin transaccional anotación en términos de método run sub-hilo de añadir nueva forma de rosca, la rosca niño se ejecuta en un no transaccional
    1,4 asíncrono usando springboot de notas, el principal hilos, además de notas de transacción, sub-hilo sin Asuntos observa
    el hilo principal y los Asuntos hilo hijo presentadas con
    1,5 usos springboot de notas asíncronas, el hilo principal de más de transacción notas, sub-hilo sin notas de transacción, excepción sub-hilo
    de la rosca principal y las transacciones hilo hijo son no comprometido
    1,6 asíncrono usando springboot de notas, además de las notas principales asuntos de hilo, además de transacción comentario sub-hilo @Transactional (propagación = Propagation.REQUIRES_NEW)
    el hilo principal y el hilo niño la transacción se presentaron (rosca hilo hijo enviar Submit emperador)
    1,7 usando asíncrono comentario springboot, el maestro añadir transacción hilo de comentarios, además de transacción comentario sub-hilo @Transactional (propagación = Propagation.REQUIRES_NEW), hilo hijo anormal
    el hilo principal y las transacciones hilo hijo son no comprometido
    1,8 asíncrono usando springboot de notas, más el notas principales asuntos de rosca, sub-hilo además de transacción de la anotación @ transaccional (propagación = P ropagation.REQUIRES_NEW), el hilo principal anormal
    hilo principal UNCOMMITTEDY los Asuntos hilo hijo presentarse

    Resumir.
    Notas al utilizar la configuración asíncrona Propagation.REQUIRES_NEW, el hilo principal y el hilo hijo es en realidad dos operaciones diferentes se presentaron.
    Pero para hilo hijo anormal, pero dos se deshace. hilo hijo debido a la reversión anormal, esto no es problema. Si bien una excepción arrojado al hilo principal , el hilo principal también siguió una operación de deshacer.
    Podemos pensar en las transacciones multi-hilo se anidan, a excepción provocará un retroceso cualquier sub-hilo de toda la transacción .
    Pero el hilo hijo si no anormal ejecutar la transacción se presentará directamente, sin tener en cuenta el hilo principal es anormal .

2. La escena real

     Antes encontrado una escena así, los iniciados por el usuario de un pago y somos interfaz síncrona, esta vez también solicitar una interfaz de pago de terceros (tales como interfaces de Alipay), esta vez no es un problema.
     Debido a que el pago de una devolución de llamada asincrónica tan rápido , lo que resulta en una base de datos con el número de orden para encontrar menos datos ( datos no presentados a almacenamiento ).
     Con un servicio para hacer esto ciertamente no es pensar en las operaciones de almacenamiento en un método asincrónico se hizo principalmente para asegurar que la interfaz antes de llamar a una base de datos de terceros tiene un dispositivo de almacenamiento (transacción sub-hilo comprometerse).
     Esta vez podemos adoptar prácticas por encima de 1,7, el hilo hijo que la prioridad del hilo principal presentar, pero incluso si no se puede garantizar un cierto sub-hilo de ejecución es más rápida que la devolución de llamada .
 

3. Mejora

    tercer interfaz general de devolución de llamada de las partes tiene un tiempo de espera, que no quiere que lo haga cualquier procesamiento lógico. Mientras se devuelve el mensaje recibido al éxito.
    Ellos recibirán la lógica de procesamiento de mensajes y servicio por separado, después de recibir las declaraciones de devolución de llamada con éxito, mientras que la lógica de negocio asíncrona.
    Si esta vez no ha puesto en el almacenamiento, la devolución de llamada de identificación único (número de pedido y un parámetro de devolución de llamada) en la caché.
    Después de que el almacenamiento de hilo hijo también hacer una operación similar, el número de orden caché de consultas si hay (no se explica en primer lugar a la devolución de llamada), a continuación, para obtener los parámetros de devolución de llamada manualmente invocar una notificación asíncrona.
    Por supuesto, esto es probablemente un caso extremo, el método de devolución de llamada que acaba de terminar una consulta, poner el cache de procesos / hijo acaba de almacenamiento, el acceso de la caché al mismo tiempo. Porque todavía existe en el número de orden de la memoria caché.
    Esta probabilidad muy baja de problema, puede ejecutar un programa de compensación de retardo de tiempo (1h una vez).
 

Publicados 115 artículos originales · ganado elogios 58 · Vistas de 230.000 +

Supongo que te gusta

Origin blog.csdn.net/Angry_Mills/article/details/82620286
Recomendado
Clasificación