Transactional programming in a multi-core environment