示例:
代码语言:javascript复制@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类,其中包含了四个方法:
- saveUser():用于添加用户,并使用@Transactional注解标记为事务方法。
- updateUser():用于修改用户信息,并使用@Transactional注解标记为事务方法。该方法还使用了默认的隔离级别和超时时间。
- updateUserEmail():用于修改用户的电子邮件地址,并使用@Transactional注解标记为事务方法。该方法使用了REQUIRES_NEW传播行为,READ_COMMITTED隔离级别和默认的超时时间。
- deleteUser():用于删除用户,并使用@Transactional注解标记为事务方法。该方法使用了默认的传播行为和隔离级别,但指定了5秒的超时时间。
除了上面的示例中使用的@Transactional注解外,我们还可以使用编程式事务管理来管理事务。下面是一个示例代码,演示了如何在Spring Boot中使用编程式事务管理来管理事务:
代码语言:javascript复制@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块中,我们将所有的事务操作放在一个事务中,并在出现异常时回滚事务。