Leveraging Hardware Support For Transactional Execution To Address Correctness And Performance Challenges In Software