实战事务处理-适用于使用hibernate作持久层的系统

本文针对遗留系统的事务处理问题提出了解决方案。原本系统中事务处理分散在DAO和服务层,导致事务边界不清。通过调整将整个业务操作放入单一事务中,确保了数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遗留系统采用了struts和hibernate,层次划分是很常见的表现层、service层、DAO层。

 

目前遗留系统有个事务处理的问题。代码在事务处理上面不统一:有的放在DAO层,有的在service层,各位看官肯定要说,这都没有统一吗,简直一堆狗屎。不错,我也觉得臭的受不了,所以采用了个简单的办法,真的很简单,呵呵。

 

其实如果事务处理的合理,事务处理放在哪一层倒是都可以。对于划分出服务层的系统来说,事务放在DAO处理会造成service层成为一个鸡肋的层次。关键是遗留系统处理service层事务的代码有问题:假设一个service方法包含了2个DAO的操作,且看有的代码:

 

Service方法:

Public void serviceMethod(){

  dao.method1();
  dao.method2();

}

 

 

DAO方法:
Public void method1(){
  Session session = HibernateUtil.currentSession();
  session.beginTransaction();
  ....
 session.getTransaction().commit();

}

 

 

Public void method2(){

  Session session = HibernateUtil.currentSession();
  session.beginTransaction();
  ....
  session.getTransaction().commit();

}

 

 

显然写代码的人认为service层的2个方法是一个事务单元,可是如此处理的结果:method1和method2却是执行在两个事务中,很显然这样处理是错误的。

 

个人认为,以下方法适用于hibernate做持久化处理的系统。当然,在此基础上稍做修改,也适用于直接应用JDBC或者其他持久层框架的系统。


 

Service方法:

Public void serviceMethod(){

  Session session = HibernateUtils.getCurrentSession();

  Transaction tx = session.beginTransaction();

 

  dao.method1();

  dao.method2();

 

  tx.commit();

}

 

 

DAO方法:

Public void method1(){

  Session session = HibernateUtils.getCurrentSession();

  session.save(po1);

}

 

Public void method2(){

  Session session = HibernateUtils.getCurrentSession();

  session.update(po2);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值