[英]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.