Hi Sion, My question is how can we generate the saga execution graph with the rollback request at the first place?
Willem Jiang Twitter: willemjiang Weibo: 姜宁willem On Thu, Jan 24, 2019 at 6:04 PM tsubasaotl <[email protected]> wrote: > > 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"<[email protected]>; > Date: Fri, Jan 18, 2019 10:26 AM > To: "dev"<[email protected]>; > Cc: "dev"<[email protected]>; > 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 <[email protected]> 于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
