mr_l1u 2024-04-07 23:14 采纳率: 66.7%
浏览 3
已结题

seata的tcc模式,是否不支持dubbo远程?

我的TM是这样的:

@GlobalTransactional
    @ApiOperation(value = "tcc")
    @PostMapping("/tcc")
    public void tcc(){
        System.out.println(tccProviderService.prepare(null));
        System.out.println(tccProviderService2.prepare(null));
        throw new RuntimeException("123");
    }

RM是这样的,两个都差不多就贴一个:

@DubboService(group = "tcc2")
public class TCCProviderServiceImpl implements TCCProviderService2 {
    @Override
    public String prepare(BusinessActionContext context) {
        System.out.println("准备2");
        return "tcc生产者2";
    }

    @Override
    public String commit(BusinessActionContext context) {
        System.out.println("提交2");
        return "提交2";
    }

    @Override
    public String rollback(BusinessActionContext context) {
        System.out.println("回滚2");
        return "回滚2";
    }
}

然后我的TCC接口是这样的:

public interface TCCProviderService2 {
    @TwoPhaseBusinessAction(name = "tt2")
    String prepare(BusinessActionContext context);

    String commit(BusinessActionContext context);

    String rollback(BusinessActionContext context);
}


这个调用prepare方法都成功了,但是不论回滚还是提交,最后的seata服务都会报错:

img

最后我翻看了下tcc的源码发现二阶段提交TwoPhaseBusinessAction注解上有这么一句话:

 * TCC annotation.
 * Define a TCC interface, which added on the try method.
 * Must be used with `@LocalTCC`.

请问,这是否意味着,我上面的TCC写法是不支持的?我看github上的案例也是要么加了localTCC注解,要么dubbo生产者都在同一个服务里。

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-04-08 01:34
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据你的描述和对TCC模式的理解,Seata的TCC模式确实需要结合@LocalTCC注解来使用。在你的代码中,TCCProviderService2接口的方法上添加了@TwoPhaseBusinessAction注解,但没有添加@LocalTCC注解,这可能导致Seata无法正确处理事务的提交和回滚。
    解决方案是在TCCProviderService2接口上添加@LocalTCC注解,示例如下:
    javaCopy code

    @LocalTCC
    public interface TCCProviderService2 {
    @TwoPhaseBusinessAction(name = "tt2")
    String prepare(BusinessActionContext context);
    String commit(BusinessActionContext context);
    String rollback(BusinessActionContext context);
    }
    

    另外,确保在Seata的配置中正确配置了Dubbo的代理模式为JDK(默认是JDK,如果你的Dubbo使用了其他代理模式,需要在配置中显式设置为JDK),示例如下:
    propertiesCopy code

    # Dubbo配置
    seata.integration.dubbo.generic = false
    seata.integration.dubbo.proxy = jdk
    

    以上是解决问题的思路和方法,希望能帮到你!如果有其他问题或疑问,请随时提出。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月7日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真