最近老和同事争执一个Spring+Hibernate更新数据库的问题,由于使用Spring控制Hibernate事务,所以我的Service层很简单:
public class CompanyServiceImpl implements CompanyService {
private CompanyDao companyDao;
public void setCompanyDao(CompanyDao companyDao) {
this.companyDao = companyDao;
}
public void updateCompany(Company company) throws BusinessException {
try {
companyDao.updateCompanyInfo(company);
} catch (DataAccessException dae) {
throw new BusinessException("error.data.access");
}
}
一个很普通的调用Dao的方法,但是我这个同事说必须考虑并发的问题,如果两个人同时操作,一个人将这个对象删除了,而另一人去更新肯定要出错。
所以他的写法:
sychronized(this){
try {
Company company= compnayDao.getCompanyByFK(String id);
company.setCompanyName("111");
companyDao.updateCompanyInfo(company);
} catch (DataAccessException dae) {
throw new BusinessException("error.data.access");
}
}
它的做法是在更新之前将对象取出,然后只更新相应的字段,这样就已经增加了一次数据库操作(不过我认为这个在某些时候哦还是可以接受的,如工作流),但是他又加上了同步……
争来争去也没有结果,我也不知道有什么更好的办法,的确同步的问题在B/S架构中是很令人头疼的事情,这个涉及到脏数据读取的问题也是有很多解决办法,Spring的事务管理就可以处理,但是我还不知道怎么用。我觉得我的方法已经可以处理,因为捕获了DataAccessException 异常,或者我也可以在可预知的情况下捕获其他异常进行识别,但是这样也比较复杂,也很可能因为某些原因无法达到效果。
所以在这里提问,希望大家都来讨论一下,你认为怎样做或者你的项目中对于脏数据、并发访问控制和处理的解决方法。