Preserving the appeal of transactional programming