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