[讨论]有关Spring+Hibernate更新数据库的操作

最近老和同事争执一个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 异常,或者我也可以在可预知的情况下捕获其他异常进行识别,但是这样也比较复杂,也很可能因为某些原因无法达到效果。

所以在这里提问,希望大家都来讨论一下,你认为怎样做或者你的项目中对于脏数据、并发访问控制和处理的解决方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值