Spring Boot的事务管理(二)

2023-04-05 15:27:04 浏览数 (1)

示例:

代码语言: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块中,我们将所有的事务操作放在一个事务中,并在出现异常时回滚事务。

0 人点赞