How would you design a distributed transaction system across multiple microservices without compromising data consistency?