I came accross this article about managing transactions within a SOA environment. There Vinay Singla mentions 4 techniques:
1) Perform the operations that support transactions before the operations that don’t support transactions (technique 2 can help)
2) Use compensating transactions (services must support compensating capabilities)
3) Break the transaction into multiple decoupled transactions
4) Execute the transaction as a long-running transaction
Maybe you think of WS-Transaction and WS-Reliability but these standards have not yet been mature enough.
Another technique not mentioned is the use of Functional/Technical maintenance. In this case when a step is not fulfilled, it will be send to a queue. This will be picked up by maintenance to correct the problem.
I always fancy the most simple solution that decreases complexity for situations that may occur only once in a while, but this depends of course on the requirements.