As per what chrisrichardson wrote about compensating transactions in sagas in microservices:
What are compensating transactions?
The rejectOrder() command is an example of a compensating transaction. Unlike ACID transactions, sagas cannot automatically undo changes made by previous steps since those changes are already committed. Instead, you must write compensating transactions that explicitly undo those changes. Each step of a saga that is followed by a step that can fail (for business reasons) must have a corresponding compensating transaction.
In the Create Order Saga, createOrder() has the rejectOrder() compensating transaction because the reserveCredit() step can fail. The reserveCredit() step does not need a compensating transaction because the approveOrder() step cannot fail. And, the approveOrder() step does not need a compensating transaction because it’s the last step of the saga.
Does this literally mean that a step won't need a compensating transaction as long as its following step doesn't fail for business reasons? What if the following step fails for some technical reasons -- some bugs or some inter-microservice communication issues e.g.?