dtm分布式事务——saga事务超时多次触发

简介: saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。

问题背景


在使用saga分布式事务的时候,接口执行时间过长,导致 dtm-server多次重发 请求到节点


在dtm文档中,关于超时的说明如下


saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。


dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。


saga.TimeoutToFail = 1800


这里的Timeout指的是 整个事务的超时时间,而我们这里出现的问题是单个节点(子事务)的超时时间导致重发


排查


dtm-server的报错日志


{"level":"info","ts":"2022-03-01T21:37:15.276+0800","caller":"dtmsvr/trans_status.go:27","msg":"TouchCronTime for: {\"ID\":0,\"create_time\":\"2022-03-01T21:30:53.3232344+08:00\",\"update_time\":\"2022-03-01T21:37:15.2743237+08:00\",\"gid\":\"ghXUgV63AnsBwtxa6LtY5o\",\"trans_type\":\"saga\",\"steps\":[{\"action\":\"http://127.0.0.1:8888/order_create\",\"compensate\":\"http://127.0.0.1:8888/order_create_compensate\"},{\"action\":\"http://127.0.0.1:8889/goods_inventory\",\"compensate\":\"http://127.0.0.1:8889/goods_inventory_compensate\"}],\"payloads\":[\"{\\\"goods_id\\\":1,\\\"number\\\":3}\",\"{\\\"goods_id\\\":1,\\\"number\\\":3}\"],\"status\":\"submitted\",\"protocol\":\"http\",\"next_cron_interval\":20,\"next_cron_time\":\"2022-03-01T21:37:35.2743237+08:00\",\"wait_result\":true}"}
{"level":"error","ts":"2022-03-01T21:37:15.277+0800","caller":"dtmsvr/trans_type_saga.go:136","msg":"exec branch error: http/grpc result should be specified as in:\nhttps://dtm.pub/summary/arch.html#http\nunkown result will be retried: Post \"http://127.0.0.1:8889/goods_inventory?branch_id=02&gid=ghXUgV63AnsBwtxa6LtY5o&op=action&trans_type=saga\": dial tcp 127.0.0.1:8889: connectex: No connection could be made because the target machine actively refused it.","stacktrace":"github.com/dtm-labs/dtm/dtmsvr.(*transSagaProcessor).ProcessOnce.func3.1\n\t/github/workspace/dtmsvr/trans_type_saga.go:136\ngithub.com/dtm-labs/dtm/dtmsvr.(*transSagaProcessor).ProcessOnce.func3\n\t/github/workspace/dtmsvr/trans_type_saga.go:140"}


通过报错和查看源码得知 还有一个RequestTimeout需要配置


解决


RequestTimeout默认时间是3s,我们可以根据需要调大一些,也可以不调整这里 在dtm-server下次重发的时候通过接口幂等控制返回处理完成的结果,完成整个事务的调用

目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
6月前
|
运维 监控 Java
Spring Cloud Alibaba分布式事务问题之事务commit失败如何解决
Spring Cloud Alibaba提供了一套在Spring Cloud框架基础上构建的微服务解决方案,旨在简化分布式系统的开发和管理;本合集将探讨Spring Cloud Alibaba在实际应用中的部署和使用技巧,以及该框架常见问题的诊断方法和解决步骤。
|
6月前
|
消息中间件 Dubbo 应用服务中间件
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
198 0
|
29天前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
16天前
|
监控
Saga模式在分布式系统中保证事务的隔离性
Saga模式在分布式系统中保证事务的隔离性
|
2月前
Saga模式在分布式系统中如何保证事务的隔离性
Saga模式在分布式系统中如何保证事务的隔离性
|
4月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中与事务隔离级别结合使用
乐观锁在分布式数据库中与事务隔离级别结合使用
|
6月前
|
消息中间件 Java 关系型数据库
Spring事务与分布式事务
这篇文档介绍了事务的概念和数据库事务的ACID特性:原子性、一致性、隔离性和持久性。在并发环境下,事务可能出现更新丢失、脏读和不可重复读等问题,这些问题通过设置事务隔离级别(如读未提交、读已提交、可重复读和序列化)来解决。Spring事务传播行为有七种模式,影响嵌套事务的执行方式。`@Transactional`注解用于管理事务,其属性包括传播行为、隔离级别、超时和只读等。最后提到了分布式事务,分为跨库和跨服务两种情况,跨服务的分布式事务通常通过最终一致性策略,如消息队列实现。
70 0
|
6月前
|
SQL 关系型数据库 MySQL
Flink CDC产品常见问题之读分布式mysql报连接超时如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
6月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
92 0

热门文章

最新文章