我发现的解决方案是将相关部分分成单独的事务。在我的情况下,我正在检查用户是否存在,如果不存在,但它在我的第三方数据库中创建它。这意味着如果身份验证失败,那么新用户的创建将不会回滚,但如果需要,它可以不同地分开,因此创建和身份验证方法在同一个事务方法中。
public void login(String username, String password)
{
User user = null;
try {
user = userHelper.findUserByUsername(username);
} catch (UserNotFoundException e) {
log.warn(e);
if (integrationLayer.checkUserExists(username))
{
user = userHelper.createUser(username, password);
}
else
{
return false;
}
}
return userHelper.authenticate(user, password);
}
@Transactional
public User userHelper.findUserByUsername(String Username)
{
... find and return user ...
... throw user not found exception if not found ...
}
@Transactional
public User userHelper.createUser(String Username, String Password)
{
... create and return the new user ...
}
@Transactional
public Boolean userHelper.authenticate(String Username, String Password)
{
... authenticate the user ...
}
@Transactional
public Boolean integrationLayer.checkUserExists(String username)
{
... if the user exists in the third party DB return true ...
}