A three-tier application is organized as three layers: human users interact with front-end clients (e.g browsers); middle-tier application servers (e.g. Web servers) contain the application's business logic, and perform transactions against back-end databases. Although three-tier applications are becoming mainstream, they usually fail to provide sufficient reliability guaranteesto the users. Usually, replication and transaction-processing techniques are applied to specific parts of the application, but their combination does not provide end-to-end reliability. The aim of this paper is to precisely define a desirable, yet realistic, specification of end-to-end reliability in three-tier applications. We present the specification in the form of a problem, called Exactly-Once Transactions, which encompasses both safety and liveness properties in such environments. We also describe a practical protocol that solves the problem and we discuss its implementation and performance in a practical setting.