2881099 / FreeSql.Cloud

提供跨数据库访问,分布式事务TCC、SAGA解决方案。
MIT License
74 stars 23 forks source link

saga_app_unit 不会记录编排的所有步骤信息吗? #5

Open Roy-se7en opened 1 year ago

Roy-se7en commented 1 year ago

saga_app_unit 不会记录编排的所有步骤信息,只会记录执行成功的步骤? 举例: 步骤编排:A向B转账

  1. A减100块
  2. B加100块

步骤1执行成功,步骤2执行失败,之后回滚步骤1(回滚失败-超过最大次数), saga_app_unit表中只有 步骤1的记录,没有步骤2的记录 上述例子中,假如最后需要人工介入 介入方式1:继续人工回滚,没问题 介入方式2:可能继续执行步骤2(B加100块),缺少信息了

这种情况,请问有什么办法吗

2881099 commented 1 year ago

既然回滚了就不应该继续向前执行了。应该重新建立业务,否则就把问题弄复杂了。

个人理解:每一次业务操作应该单一化。

Roy-se7en commented 1 year ago

所以确实是不会记录步骤2的信息?人工介入也只能继续回滚?

Roy-se7en commented 1 year ago

既然回滚了就不应该继续向前执行了。应该重新建立业务,否则就把问题弄复杂了。

个人理解:每一次业务操作应该单一化。

有时候碰到的情况是,确实无法回滚,例如:更新数据,正常我们不会去记录更新前的数据,所以也就没办法回滚。 所以只能希望保留当时saga事务的所有信息,不管是继续回滚,还是往前执行,都有原始参数

2881099 commented 1 year ago

TCC 可能更适合这种场景,提交事务之前,先锁定资源,以便回滚。

Roy-se7en commented 1 year ago

TCC 可能更适合这种场景,提交事务之前,先锁定资源,以便回滚。

谢谢,那我考虑换成TCC试试

Roy-se7en commented 1 year ago

TCC 可能更适合这种场景,提交事务之前,先锁定资源,以便回滚。

不过我采用的是远程访问webpi执行步骤,这种应该也实现不了基于数据库的事务回滚吧?

2881099 commented 1 year ago

他是按每个独立单元按顺序排列执行的,不属于整个事务

执行不报错,即认为独立单元成功(每个阶段都如此)

Roy-se7en commented 1 year ago

他是按每个独立单元按顺序排列执行的,不属于整个事务

执行不报错,即认为独立单元成功(每个阶段都如此)

了解,但是还是回到我的标题的问题,有没有哪里可以设置unit表会保存 所有编排步骤的信息?

2881099 commented 1 year ago

unit 表属于功能性的表,用来判断或执行整个流程。

如果有必要可以在业务层上单独记录这些信息

Roy-se7en commented 1 year ago

unit 表属于功能性的表,用来判断或执行整个流程。

如果有必要可以在业务层上单独记录这些信息

ok, 谢谢你的回复和建议