@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User saveUser(User user) {
return userRepository.save(user);
}
@Transactional
public User updateUser(User user) {
User savedUser = userRepository.findById(user.getId()).orElse(null);
if (savedUser == null) {
throw new RuntimeException("User not found!");
}
savedUser.setName(user.getName());
savedUser.setEmail(user.getEmail());
return userRepository.save(savedUser);
}
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public User updateUserEmail(String id, String email) {
User user = userRepository.findById(id).orElse(null);
if (user == null) {
throw new RuntimeException("User not found!");
}
user.setEmail(email);
return userRepository.save(user);
}
@Transactional(timeout = 5)
public void deleteUser(String id) {
userRepository.deleteById(id);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
在上面的示例中,我们定义了一个UserService类,其中包含了四个方法:
除了上面的示例中使用的@Transactional注解外,我们还可以使用编程式事务管理来管理事务。下面是一个示例代码,演示了如何在Spring Boot中使用编程式事务管理来管理事务:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PlatformTransactionManager transactionManager;
public User saveUser(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
User savedUser = userRepository.save(user);
transactionManager.commit(status);
return savedUser;
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
}
在上面的示例中,我们定义了一个UserService类,并使用@Autowired注解自动装配了一个PlatformTransactionManager对象,用于进行编程式事务管理。在saveUser()方法中,我们使用DefaultTransactionDefinition对象来定义一个默认的事务属性,然后使用TransactionStatus对象来管理事务的状态。在try-catch块中,我们将所有的事务操作放在一个事务中,并在出现异常时回滚事务。