我正在嘗試在調用函數時創建用戶(在同步塊中)。當有多個並行調用時,即使用戶已經在同步塊中創建,它也會創建具有相同emailId的多個用戶。Java Spring-Hibernate同步數據庫更新問題
請注意,我的數據庫中的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沒有返回正確的數據。
這是在一個trasaction中做同步的很常見的錯誤。我很確定我將能夠搜索重複的問題... – 2014-09-05 19:48:33
@水平:你提供的問題是不一樣的,我已經有一個同步塊和塊是同步的。但是hibernate沒有看到新創建的用戶。 – cldy1020 2014-09-05 23:07:52
您正在執行活動事務下的同步。當同步塊結束時,事務還沒有被提交(因此進入同步塊的其他線程是*「看不到新創建的用戶」*)。根本問題與鏈接問題完全相同。 – 2014-09-05 23:32:43