servicecomb-pack icon indicating copy to clipboard operation
servicecomb-pack copied to clipboard

Doesn't Saga support the compensation when the value of retries is greater than naught?

Open jiuang opened this issue 6 years ago • 2 comments

I wrote a compensable method (retries = 2), its rollback method would not be called when the program encounter some errors.

I guess that there is a problem on script which is response for finding uncompensation method out.

Code:

private void saveUncompensatedEventsToCommands() {
    eventRepository.findFirstUncompensatedEventByIdGreaterThan(nextEndedEventId, TxEndedEvent.name())
        .forEach(event -> {
          LOG.info("Found uncompensated event {}", event);
          nextEndedEventId = event.id();
          commandRepository.saveCompensationCommands(event.globalTxId());
        });
}

@Override
public List<TxEvent> findFirstUncompensatedEventByIdGreaterThan(long id, String type) {
    return eventRepo.findFirstByTypeAndSurrogateIdGreaterThan(type, id, SINGLE_TX_EVENT_REQUEST);
 }

// script for finding uncompensation out
@Query("SELECT t FROM TxEvent t "
      + "WHERE t.type = ?1 AND t.surrogateId > ?2 AND EXISTS ( "
      + "  SELECT t1.globalTxId FROM TxEvent t1 "
      + "  WHERE t1.globalTxId = t.globalTxId "
      + "    AND t1.type = 'TxAbortedEvent' AND NOT EXISTS ( "
      + "    SELECT t2.globalTxId FROM TxEvent t2 "
      + "    WHERE t2.globalTxId = t1.globalTxId "
      + "      AND t2.localTxId = t1.localTxId "
      + "      AND t2.type = 'TxStartedEvent' "
      + "      AND t2.creationTime > t1.creationTime)) AND NOT EXISTS ( "
      + "  SELECT t3.globalTxId FROM TxEvent t3 "
      + "  WHERE t3.globalTxId = t.globalTxId "
      + "    AND t3.localTxId = t.localTxId "
      + "    AND t3.type = 'TxCompensatedEvent') AND ( "
      + "  SELECT MIN(t4.retries) FROM TxEvent t4 "
      + "  WHERE t4.globalTxId = t.globalTxId "
      + "    AND t4.localTxId = t.localTxId "
      + "    AND t4.type = 'TxStartedEvent' ) = 0 "
      + "ORDER BY t.surrogateId ASC")
  List<TxEvent> findFirstByTypeAndSurrogateIdGreaterThan(String type, long surrogateId, Pageable pageable);

formative script: image

This script told us what it's invalid to rollback a compensable method of enabled retry, because the value of retries attribute must be greater than naught in its last condition.

Please point them out when I make some mistakes. Thank you!

jiuang avatar Jul 18 '18 06:07 jiuang

Thx for pointing that out. It's a little bit complex to cover the retry user case without introduce the retry event. I just create JIRA for it, we will rewrite this part shortly.

WillemJiang avatar Jul 21 '18 08:07 WillemJiang

OK. Looking forward to fixing it. You are so hard-working. Thank you!

jiuang avatar Jul 23 '18 03:07 jiuang