簡體   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