Reconciling replication and transactions for the end-to-end reliability of CORBA applications