[seata]不管全局事务是否提交成功还是进行回滚 对应的branch_table表的status字段的值一直是0,这个是为什么?

2024-04-28 867 views
9

有点好奇这个问题 源码看起来不太理解(实力不济) image image

回答

1

多数据源?

5

seata服务端连接的就是一个数据库 客户端不同数据库 在进行branch_table表的数据添加后status字段就不会改变 服务端通过writeSession()方法调用删除反正数据时我打印出session的数据这个对应分支的数据的status还是不会改变。全局数据在进行删除的时候的status的值是最终状态的值(比如全局事务需要回滚时,回滚完成后调用writeSession()删除表数据,这时status状态是正确的),按理说记录了每个分支的数据还有status字段记录状态的话进行删除的时候应该和全局事务删除的status类似 但是我看最终删除时所有的分支数据的这个status字段都始终时0

1

这个数据的产生时我自己手动注释掉了删除逻辑产生的 image

2

undolog是client侧,所以我也是问的client侧

9

branch是先下发二阶段,再删除branchsession,所以除非你注释的位置不对,否则不存在不删除undolog的问题

4

客户端的这个undolog日志不会删除如果我注释掉对应的branch_table的删除的话(不知道为什么), 但是我说的是服务端的branch_table中的status字段在整个事务完成后的值一直是0(不管是事务正常完成还是进行回滚),我是觉得这个地方有点奇怪 只有global_table表的status会记录对应状态但是branch_table不会。

branch先下发二阶段 但是二阶段对应的状态一直是0也就是对应的Unknow 这有点奇怪

0

client侧用的是不同的数据源两个client服务 每个服务用的不同数据库

9

先确认一点,不改动源码,是否undolog被删除,如果都不删除就是你代理存在问题,多数据源不要开启自动代理,用手动把物理datasource代理,不要把逻辑用的动态数据源给代理了,动态数据源的datasource内使用被代理的物理datasource. 既然都改源码,建议阅读DefaultCore的代码

1

我的关注的不是说undolog日志有没有删除,而且客户端的dataSource我已经使用数据源代理了 正常流程我已经验证了是可以的(我自定义了数据源,所以添加了seata的DataSourceProxy),客户端的undolog日志在事务完成之后是会删除的。我这个提的问题一直的关注点是branch_table的status字段的问题。某个分支进行了回滚但是对应branch_table表记录的分支的status状态一直不发生改变,所以我好奇的是这个,因为在验证的时候global_table表这个status字段会记录对应全局的事务是提交成功还是失败的。

2

branchtable的status不会进行修改的,除非失败会进行上报,at上默认不会上报,所以你无需关注