Fenómeno y solución de interbloqueo de transacciones distribuidas .Net

En este artículo, presentaré el fenómeno de interbloqueo de transacciones distribuidas .Net encontrado una vez y la solución. Primero comprenderemos la composición del marco de la transacción, luego analizaremos el código que causa el interbloqueo y finalmente propondremos una solución.

marco de transacción

El marco de desarrollo JMSFramework divide las transacciones distribuidas en cuatro etapas, a saber: ejecución, confirmación, envío y reintento.

1. Ejecución
Llame a microservicios para realizar operaciones comerciales relacionadas. Si alguna de estas ejecuciones de servicio arroja una excepción o falla, todas las transacciones se revierten.

2. Confirmación
En esta etapa, se enviará una solicitud de confirmación a cada microservicio. El objetivo principal es verificar si la red actual es normal y si el microservicio está inactivo. Si hay alguna anomalía en esta etapa, todas las transacciones se ejecutarán. atrás.

3. Enviar
Primero, JMSFramework notificará a la puerta de enlace para marcar la transacción distribuida como exitosa. (Si la puerta de enlace de notificación falla, todas las transacciones se revertirán). Luego,
notifique a cada microservicio que confirme la transacción para asegurarse de que todas las operaciones se hayan completado.
Si un servicio no puede confirmar una transacción, no afectará a otros servicios para confirmar transacciones.

4. Reintentar
Hay una posibilidad muy pequeña de que la ejecución llegue a esta etapa.
Cuando un microservicio deja de funcionar inesperadamente cuando la transacción se confirma realmente, la transacción no se confirma correctamente. Una vez que el servidor se reinicia, consulta la puerta de enlace y se entera de que la transacción se ha marcado como exitosa. En este momento, el sistema volverá a ejecutar automáticamente el código comercial relevante y enviará la transacción para garantizar la consistencia de los datos.

código interbloqueado

A continuación, veamos el código que desencadena el interbloqueo:

            using ( var client = new RemoteClient(gatewayAddrs))
            {
                //标识后面的调用需要启用分布式事务控制
                client.BeginTransaction();
                
 

Supongo que te gusta

Origin blog.csdn.net/shengyin714959/article/details/131640760
Recomendado
Clasificación