we talk a bit about compensations in the post:
https://restate.dev/blog/graceful-cancellations-how-to-keep-...
the gist is that you can just use catch statements and put rollback logic in it. Restate guarantees that handlers run to the end, so there's no risk that it somehow won't reach the catch statement due to an infra failure. So catch, rethrow, and then all the way up the stack, the compensations will run