您现在的位置是:首页 >其他 >SpringBoot中事务失效的场景(含示例代码)网站首页其他

SpringBoot中事务失效的场景(含示例代码)

枫飞雪飘 2024-10-29 00:01:06
简介SpringBoot中事务失效的场景(含示例代码)

在使用SpringBoot的开发过程中,我们有时候会遇到明明加了事务但是却不生效的场景,今天就稍微整理一下。

场景一:

方法未被声明为事务:在Spring Boot中,事务是基于注解或XML配置的方式进行声明的。如果一个方法没有被声明为事务,那么其中的数据库操作将不会受到事务管理的影响,可能导致数据不一致的问题。

public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 事务未声明
    public void updateUserStatus(Long userId, boolean active) {
        userRepository.updateStatus(userId, active);
    }
}

在上述示例中,updateUserStatus方法没有被声明为事务,即使该方法中的数据库更新操作失败,也不会回滚,可能导致数据库中的数据和应用状态不一致。

场景二:

异常未被抛出:在默认情况下,Spring事务管理器只会在方法抛出RuntimeException及其子类的异常时回滚事务。如果方法抛出的是受检查异常或未抛出任何异常,事务将不会回滚。

@Service
@Transactional
public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void placeOrder(Order order) throws IOException {
        // 数据库更新操作
        orderRepository.save(order);

        // 受检查异常未被抛出
        try {
            sendNotification(order);
        } catch (IOException e) {
            // 异常被捕获,事务不会回滚
        }
    }

    private void sendNotification(Order order) throws IOException {
        // 发送通知
        throw new IOException("Failed to send notification");
    }
}

在上述示例中,placeOrder方法中的数据库更新操作将会执行,即使在sendNotification方法中抛出了异常。因为sendNotification方法中的异常被捕获了,并未向上抛出。

场景三:

方法不是公开的:在Spring事务管理中,默认情况下只会应用于公开方法。如果事务注解所标注的方法是私有、受保护或默认访问级别的,事务将无效。

 

@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 私有方法,事务不会应用于该方法
    @Transactional
    private void updateUserStatus(Long userId, boolean active) {
        userRepository.updateStatus(userId, active);
    }

    public void activateUser(Long userId) {
        updateUserStatus(userId, true);
    }
}

在上述示例中,updateUserStatus方法是私有的,虽然在activateUser方法中调用了它,但事务注解将不会应用于私有方法,导致事务失效。

这些是一些可能导致Spring Boot事务失效的常见场景和示例。在实际开发中,应注意事务的声明、异常的抛出和方法的可见性,以确保事务的正确应用和回滚。

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。