seata TCC开启Fence二阶段Cancel可能不会执行

vh0rcniy  于 3个月前  发布在  其他
关注(0)|答案(8)|浏览(86)

上图中,一阶段业务逻辑如果有异常,会回滚,一阶段的fence_log实际上插入失败了,在回滚过程中,会判断没有fence_log,不执行cancel逻辑,如下图

如果一阶段的业务全是能够被Spring事务管理的操作还可以,如果不是可以被Spring事务管理的操作,这里应该会有问题

zzlelutf

zzlelutf1#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

dly7yett

dly7yett2#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

bq3bfh9z

bq3bfh9z3#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

tcc应该是prepare commit cancel,职责是单一的行为,当prepare都失败何必进行cancel?本地事务就回滚了,否则如果一阶段什么都没执行的情况下挂了,执行cancel去会发生什么问题也未可知?

u1ehiz5o

u1ehiz5o4#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

tcc应该是prepare commit cancel,职责是单一的行为,当prepare都失败何必进行cancel?本地事务就回滚了,否则如果一阶段什么都没执行的情况下挂了,执行cancel去会发生什么问题也未可知?

这个我理解,我想的是如果prepare阶段的操作不会被本地事务管理,比如redis,这种情况只能在一阶段自主做处理了

bgtovc5b

bgtovc5b5#

xdm,我先把之前那个pr链接贴上了 #4532

eni9jsuy

eni9jsuy6#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

tcc应该是prepare commit cancel,职责是单一的行为,当prepare都失败何必进行cancel?本地事务就回滚了,否则如果一阶段什么都没执行的情况下挂了,执行cancel去会发生什么问题也未可知?

这个我理解,我想的是如果prepare阶段的操作不会被本地事务管理,比如redis,这种情况只能在一阶段自主做处理了

actually, the logic for setting fence_log is used on relational databases and is not suitable for operations such as pure redis.

bakd9h0s

bakd9h0s7#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

tcc应该是prepare commit cancel,职责是单一的行为,当prepare都失败何必进行cancel?本地事务就回滚了,否则如果一阶段什么都没执行的情况下挂了,执行cancel去会发生什么问题也未可知?

这个我理解,我想的是如果prepare阶段的操作不会被本地事务管理,比如redis,这种情况只能在一阶段自主做处理了

actually, the logic for setting fence_log is used on relational databases and is not suitable for operations such as pure redis.

因为对框架而言不知道是一阶段回滚了还是出现悬挂风险,所以还是为了防悬挂就会插入一条防悬挂数据

kadbb459

kadbb4598#

这就是特意这么做防悬挂的,一阶段没有的fence记录就插入一条记录防止资源悬挂

这个不是悬挂,事实上是prepare阶段执行了,但是出错了,但是因为事务回滚,tried的记录没有插入,到二阶段,rollback中由于没这个记录,会被认为prepare阶段没执行,做了一个空回滚,实际上不是悬挂

tcc应该是prepare commit cancel,职责是单一的行为,当prepare都失败何必进行cancel?本地事务就回滚了,否则如果一阶段什么都没执行的情况下挂了,执行cancel去会发生什么问题也未可知?

这个我理解,我想的是如果prepare阶段的操作不会被本地事务管理,比如redis,这种情况只能在一阶段自主做处理了

actually, the logic for setting fence_log is used on relational databases and is not suitable for operations such as pure redis.

因为对框架而言不知道是一阶段回滚了还是出现悬挂风险,所以还是为了防悬挂就会插入一条防悬挂数据

感谢两位大佬解答

相关问题