Distributed transaction patterns for microservices compared