Spring Cloud integrado seata transacción distribuida modo TCC

Este artículo presentará el modo TCC de transacción distribuida seata del marco de Alibaba basado en springcloud + fingir, en el artículo anterior se ha introducido, el modo AT básicamente puede satisfacer la demanda que utilizamos transacciones distribuidas 80%. Sin embargo, el funcionamiento de las bases de datos y el middleware no relacionales (como redis, etc.), la invocación de servicios entre empresas y la invocación de aplicaciones en varios idiomas deben combinarse con el modo TCC. Para la introducción de seata, haga clic aquí para ingresar al sitio web oficial de seata .

 1. El concepto de modelo TCC

Una transacción global distribuida es un modelo de confirmación de dos fases (Try- [Confirmar / Cancelar]) como un todo. En SEATA, tanto el modo AT como el modo TCC se implementan en realidad basándose en el envío en dos fases. Su diferencia radica en:

El modo AT se basa en   una  base de datos relacional que admite transacciones ACID locales :

  • Comportamiento de preparación en una etapa: en una transacción local, las actualizaciones de datos comerciales y los correspondientes registros de reversión se envían juntos.
  • Comportamiento de confirmación en dos etapas: finaliza correctamente de inmediato y los  registros de reversión se limpian automáticamente en lotes de forma asincrónica.
  • Comportamiento de reversión en dos etapas:  genera automáticamente operaciones de compensación a través del registro de reversión para completar la reversión de datos.

En consecuencia, el modo TCC no depende del soporte de transacciones de los recursos de datos subyacentes:

  • Comportamiento de preparación de una etapa: llame a la   lógica de preparación personalizada .
  • Comportamiento de confirmación en dos etapas: llamar a la   lógica de confirmación personalizada .
  • Comportamiento de reversión en dos etapas: llamar a la   lógica de reversión personalizada .

El llamado modo TCC se refiere al soporte para incorporar   transacciones de sucursales personalizadas en la gestión de transacciones globales.

Para resumir brevemente, el modo TCC de SEATA es un modo AT manual , que le permite personalizar la lógica de procesamiento de dos etapas sin depender del undo_log del modo AT.

2. Preparación previa

3. La construcción de TM y TCC-RM (haga clic aquí para ver el código fuente)

Este capítulo se centra en la implementación de TCC basado en SpringCloud + Feign, y la construcción del proyecto se basa directamente en el código fuente

3.1 Construcción del servidor seata

Construcción de 3.2 TM

3.3 Construcción de TCC-RM

3.3.1 Definir la interfaz TCC

Como estamos usando SpringCloud + Feign, la llamada de Feign se basa en http, por lo que aquí podemos usar LocalTCC. Vale la pena señalar que @LocalTCC debe estar anotado en la interfaz, esta interfaz puede ser una interfaz comercial ordinaria, siempre que se implemente el método correspondiente de envío de dos fases de TCC.

  • @LocalTCC es adecuado para TCC en el modo SpringCloud + Feign
  • @TwoPhaseBusinessAction anota el método try, donde name es el nombre del bean del método tcc actual, simplemente escriba el nombre del método (recuerde que es globalmente único), commitMethod apunta al método submit y rollbackMethod apunta al método rollback de la transacción. Después de especificar los tres métodos, seata llamará automáticamente a commit o rollback a través del proxy dinámico según el éxito o el fracaso de la transacción.
  • La anotación @BusinessActionContextParameter puede pasar parámetros al método de la segunda fase (commitMethod / rollbackMethod).
  • BusinessActionContext se refiere al contexto de la transacción TCC
/**
 * 这里定义tcc的接口
 * 一定要定义在接口上
 * 我们使用springCloud的远程调用
 * 那么这里使用LocalTCC便可
 *
 * @author tanzj
 */
@LocalTCC
public interface TccService {

    /**
     * 定义两阶段提交
     * name = 该tcc的bean名称,全局唯一
     * commitMethod = commit 为二阶段确认方法
     * rollbackMethod = rollback 为二阶段取消方法
     * BusinessActionContextParameter注解 可传递参数到二阶段方法
     *
     * @param params  -入参
     * @return String
     */
    @TwoPhaseBusinessAction(name = "insert", commitMethod = "commitTcc", rollbackMethod = "cancel")
    String insert(
            @BusinessActionContextParameter(paramName = "params") Map<String, String> params
    );

    /**
     * 确认方法、可以另命名,但要保证与commitMethod一致
     * context可以传递try方法的参数
     *
     * @param context 上下文
     * @return boolean
     */
    boolean commitTcc(BusinessActionContext context);

    /**
     * 二阶段取消方法
     *
     * @param context 上下文
     * @return boolean
     */
    boolean cancel(BusinessActionContext context);
}

3.3.2 Realización empresarial de la interfaz TCC

Para garantizar la simplicidad del código, Controller y Service se combinan para explicar aquí, pero el proyecto real no lo es.

  • El uso de @Transational en el método try puede revertir directamente las operaciones en bases de datos relacionales a través de transacciones de primavera, mientras que las operaciones de reversión de middleware, como las bases de datos no relacionales, pueden transferirse al método rollbackMethod.
  • Utilice context.getActionContext ("params") para obtener los parámetros definidos en el intento de la primera etapa y realice operaciones de reversión comercial en estos parámetros en la segunda etapa.
  • Tenga en cuenta que tampoco es posible capturar excepciones aquí (de manera similar para manejar excepciones en el aspecto), de lo contrario, TCC reconocerá la operación como un éxito y ejecutará directamente commitMethod en la segunda etapa.
  • El commitMethod de la segunda etapa se puede confirmar como vacío.
@Slf4j
@RestController
public class TccServiceImpl implements  TccService {

    @Autowired
    TccDAO tccDAO;

    /**
     * tcc服务t(try)方法
     * 实际业务方法
     *
     * @param params - name
     * @return String
     */
    @Override
    @PostMapping("/tcc-insert")
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public String insert(@RequestBody Map<String, String> params) {
        log.info("------------------> xid = " + RootContext.getXID());
        //实际的操作,或操作MQ、redis等
        tccDAO.insert(params);
        //throw new RuntimeException("服务tcc测试回滚");
        return "success";
    }

    /**
     * tcc服务 confirm方法
     * 可以空确认
     *
     * @param context 上下文
     * @return boolean
     */
    @Override
    public boolean commitTcc(BusinessActionContext context) {
        log.info("xid = " + context.getXid() + "提交成功");
        return true;
    }

    /**
     * tcc 服务 cancel方法
     *
     * @param context 上下文
     * @return boolean
     */
    @Override
    public boolean cancel(BusinessActionContext context) {
        //todo 这里写中间件、非关系型数据库的回滚操作
        System.out.println("please manually rollback this data:" + context.getActionContext("params"));
        return true;
    }
}

3.3.3 configuración de yml relacionada con seata (versión independiente)

seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: seataGroup-${seata.application-id}
  service:
    vgroup-mapping: default
    grouplist: 127.0.0.1:8091
  config:
    type: file
    file:
      name: file.conf
  registry:
    type: nacos
    file:
      name: file.conf

 

Esto completa la configuración del modo seata-tcc.

Supongo que te gusta

Origin blog.csdn.net/bbcckkl/article/details/104524095
Recomendado
Clasificación