I think we think it too complicated. In fact, no matter what the exception is, 
As long as the rollback is called, a rollback request is added at the end of 
the call graph of saga. The actuator reads the rollback request and starts to 
reverse the compensation. The saga definition should be


{
        "policy": "BackwardRecovery",
        "requests": [{
                "id": "xxx",
                "datasource": "ds",
                "type": "sql",
                "transaction": {
                        ...
                },
                "compensation": {
                        ...
                },
                "parents": [],
        },
        ... 
        ,{
                "id": "yyy",
                "datasource": "ds",
                "type": "sql",
                "transaction": {
                        "sql": "ROLLBACK_EVENT",
                         ...
                },
                "compensation": {
                         ...
                },
                "parents": [the last ids of actual requests],
        }]
}



------------------
Yi Yang (Sion)
Apache ShardingSphere contributor


 


------------------ Original ------------------
From:  "Zheng Feng"<zh.f...@gmail.com>;
Date:  Fri, Jan 18, 2019 10:26 AM
To:  "dev"<dev@servicecomb.apache.org>;
Cc:  "dev"<d...@shardingsphere.apache.org>; 
Subject:  Re: [Discuss]Business exception cannot be rollbacked inShardingSphere 
with saga transaction.



I think it could be be resolved in ShardingSphere and catch the business
exception and mark the cached result "ROLLBACK_ONLY".
Anyway, this should be done before submitting to the saga actor.

tsubasaotl <tsubasa...@qq.com> ??2019??1??16?????? ????8:06??????

> Hi, everyone.
>
>
> In ShardingSphere, SQL and their execution result will be cached in saga
> transaction manager.
> When users call `commit` or `rollback` method, the cached SQL will
> generate `SagaDefinition`
> and submit it to the saga actuator.
>
>
> Saga actuator do `Transaction` first and get execution result from cached.
> When the result is successful, the actuator will directly judge that the
> Transaction is successful
> and execute the next Transaction.
> When the result not found in cached or the result is failed, the actuator
> will do retry or compensation
> according to configuration.
>
>
> But there is a problem that saga actuator cannot rollback when business
> exception happened.
> The situation will happen in following workflow.
>
>
>                                -----------multiple times-----------
> begin transaction --> | execute SQL --> cached result | --> throw business
> exception --> call rollback
>                                --------------------------------------
>                                                      |
>
>                                                                  |
>
>                                                                  |
> but all SQL success, saga actuator don't run compensation  <-- get result
> from cache <-- saga actuator
>
>
> All SQL is executed successfully, but the business program throws an
> exception. So the actuator will judge
> transaction is successful, and not to do compensation, which makes users
> confused.
>
>
> On this issue, I would like to ask for advice, should resolved in Saga
> actuator or ShardingSphere?
> And how to resolve better?
>
>
> ------------------
> Yi Yang (Sion)
> Apache ShardingSphere contributor

Reply via email to