【发布时间】:2014-09-05 19:25:29
【问题描述】:
我正在尝试在调用函数时创建用户(在同步块中)。当有多个并行调用时,它会创建多个具有相同 emailId 的用户,即使该用户已经在同步块中创建。
请注意,我数据库中的 emailId 字段不是唯一的,我无法将其更改为唯一。
public class UserServiceImpl implements UserService {
public void myFunction(String emailId){
//do something
synchronized(this)
{
boolean userExists = checkDuplicateEmail(emailId); //checkDuplicateEmail is a hibernate query.
if(!userExists){
createUser();
}
}
}
}
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
public boolean checkDuplicateEmail(String email) throws TechnicalException {
try {
boolean isExist = false;
Session session = getHibernateTemplate().getSessionFactory().openSession();
session.flush();
DetachedCriteria criteria = DetachedCriteria.forClass(user.class);
criteria.add(Property.forName("emailId").eq(email));
criteria.setProjection(Projections.count("emailId"));
List users = getHibernateTemplate().findByCriteria(criteria);
if (users != null && users.size() > 0) {
if (((Integer) users.get(0)) > 0l) {
isExist = true;
}
}
return isExist;
} catch (DataAccessException dataAccessException) {
throw dataAccessException;
}
}
}
块正在以同步方式执行。但是hibernate没有返回正确的数据。
【问题讨论】:
-
在事务中进行同步是很常见的错误。我很确定我将能够搜索重复的问题...
-
@pavel:您提供的问题不一样,我已经有一个同步块并且该块已同步。但是休眠没有看到新创建的用户。
-
您正在活动事务下执行同步。当同步块结束时,事务尚未提交(因此进入同步块的其他线程是“没有看到新创建的用户”)。根本问题与链接问题中的完全相同。
标签: java spring hibernate synchronization