When users execute SQL with saga transaction, ShardingSphere will execute the SQL immediately. After `commit` or `rollback` called, ShardingSphere starts to generate the saga execution graph. At this time, all SQL and their order in transaction has be known by ShardingSphere, so the saga execution graph can be generated.
Specially, for `rollback`, ShardingSphere add a rollback request at the end of graph. ------------------ Yi Yang (Sion) Apache ShardingSphere contributor ------------------ Original ------------------ From: "Willem Jiang"<willem.ji...@gmail.com>; Date: Fri, Jan 25, 2019 08:50 AM To: "dev"<dev@servicecomb.apache.org>; Cc: "dev"<d...@shardingsphere.apache.org>; Subject: Re: [Discuss]Business exception cannot be rollbacked inShardingSpherewith saga transaction. 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 <tsubasa...@qq.com> 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"<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