Spring Boot 默认采用 Spring Framework 的事务管理机制,支持声明式事务和编程式事务。
- 声明式事务
声明式事务是通过注解或 XML 配置来实现的,使用简单,适合大多数场景。Spring Boot 中使用 @Transactional 注解来声明事务,将其应用在方法或类上即可开启事务管理,示例代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
@Transactional
public void addUser(User user) {
userRepository.save(user);
}
@Override
@Transactional
public void deleteUser(int userId) {
userRepository.deleteById(userId);
}
}
在上面的例子中,@Transactional 注解被应用在了 addUser() 和 deleteUser() 方法上,表示这两个方法需要开启事务管理。如果其中任何一个方法执行过程中发生异常,则事务将回滚,保证了数据的一致性和完整性。
- 编程式事务
编程式事务是通过编写代码来控制事务的提交和回滚,使用相对比较复杂,但可以更加灵活地控制事务。Spring Boot 中可以通过 TransactionTemplate 来实现编程式事务,示例代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private TransactionTemplate transactionTemplate;
@Override
public void addUser(User user) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
userRepository.save(user);
}
});
}
@Override
public void deleteUser(int userId) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
userRepository.deleteById(userId);
}
});
}
}
在上面的例子中,TransactionTemplate 的 execute() 方法接收一个 TransactionCallback 对象,该对象的 doInTransactionWithoutResult() 方法中包含了需要进行事务管理的代码。如果执行过程中发生异常,则事务将回滚。
总的来说,Spring Boot 的事务管理机制非常强大和灵活,能够满足大多数应用场景的需求。同时,Spring Boot 还支持多种事务管理方式,如 JTA 分布式事务等,可以根据具体的业务需求进行选择和配置。