繁体   English   中英

Java服务层中的多线程

[英]Multithreading in Service layer in Java

我正在使用Spring MVC设计Web应用程序。

我在实施安全更新电子邮件和注册新用户时遇到一些问题。 电子邮件对于每个用户都是唯一的。

这是我的方法,由控制器调用以注册用户:

@Override
    public void registerUser(Client newUser) throws DuplicateEmailException {

        if(!isEmailUnique(newUser.getEmail())){
            throw new DuplicateEmailException("User with the same email is registered"
                    + " in system already");
        }

        newUser.setPassword(encodePassword(newUser.getPassword()));
        newUser.setRole(UserRole.ROLE_CLIENT);
        newUser.setStatus(UserStatus.ACTIVE);
        newUser.setEmailStatus(EmailStatus.NOTCONFIRMED);
        newUser.setRegistrationTime(LocalDateTime.now());

        clientDao.save(newUser);


    }

它是更新电子邮件的方法:

@Override
    public void updateUserEmail(String email, String newEmail, String password)
            throws InvalidPasswordException, DuplicateEmailException {
        Client client = getClientByEmail(email);
        if(!isPasswordRight(password, client.getPassword())){
            throw new InvalidPasswordException("Password doesn't match to real");
        }

        if(email.equals(newEmail)){
            return;
        }

        if(!isEmailUnique(newEmail)){
            throw new DuplicateEmailException(
                    "Such email is registered in system already");
        }

        client.setEmail(newEmail);
        client.setEmailStatus(EmailStatus.NOTCONFIRMED);
    }

可能存在这样的情况,当某些用户单击注册按钮时, registerUser(Client newUser)方法检查电子邮件的唯一性,同时第二个用户要更新电子邮件,并且在调用clientDao.save(newUser)之前, updateUserEmail(String email, String newEmail, String password)检查电子邮件的唯一性,如果两个用户的电子邮件相等,我将在db中收到两个相同的电子邮件-这是不可接受的。

我的服务层标记有@Translactional批注,会话在关闭事务之前自动刷新,并且仅在完成registerUser(..)方法后,用户才保存在db中

那么,请告诉我,我可以使用Java多线程中的哪些工具来解决此问题?

您可以通过将isEmailUnique方法滚动到保存功能中并使该save方法同步来以编程方式执行此操作。

但是更好的解决方案是使email列在数据库中具有唯一的约束,以确保无论应用来自何处,甚至来自哪个应用,都不会将重复项放入您的数据集中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM