service层步骤相互调用及事务处理的思路及解决
service层方法相互调用及事务处理的思路及解决
service层多个方法中包含相同的业务逻辑是一种很常见的现场,通常会遇到如下几个问题:
1.怎样合理的抽象出公共的业务逻辑?
2.怎样处理service层中方法之间的调用?
3.怎样处理这些方法的事务?
下面是我个人的处理方式,仅供参考。由于实现比较简单,所以相关说明较少。
代码示例:
public void serviceMehtod1(){ dao.insert(); .... dao.update(); } public void serviceMethod2(){ dao.insert(); }
serviceMehtod1中的事务范围是insert()+update(),serviceMehtod2的事务范围是insert(),
添加了事务处理后的代码很简单,相信不用我解释大家都能看明白。
public void serviceMehtod1(){ //开始事务 Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); insertService() .... updateService() tx.commit(); //事务终止 } public void serviceMethod2(){ //开始事务 Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); insertService(); tx.commit(); //事务终止 } //公共业务逻辑 //不添加事务处理 public void insertService(){ dao.insert(); } //公共业务逻辑 //不添加事务处理 public void updateService(){ dao.update(); }
当然,对于公共的业务逻辑,比较好的方式是:封装他们到一个基类。
具体的领域对象或者service层对象继承调用这个基类就可以了。
1 楼
yeminping
2009-01-12
用Spring的@Transactional不是更简单?
2 楼
charles751
2009-01-12
Spring的@Transactional本质上也是对业务逻辑添加事务控制,
只是代码中没有出现事务处理的代码而已。
这里只是介绍事务的方法之间相互调用时,应该怎样处理,
以及事务范围的划分。
只是代码中没有出现事务处理的代码而已。
这里只是介绍事务的方法之间相互调用时,应该怎样处理,
以及事务范围的划分。
3 楼
mytudousi
2010-09-02
public void serviceMehtod1(){
//开始事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
insertService()
....
updateService()
tx.commit();
//事务终止
}
这段代码,在函数中创建了一个Session,里面调用的两个函数确没有接受这个Session参数。估计楼主的是在这两个函数里面调用了得到当前Session的方法。
所以楼主获取Session的方法应该是使用类似单例模式的方案。那么如果遇到多线程怎么办?得到的还是一个Session,而辅线程和主线程在同时用这个Session的时候,肯定会出现问题。
楼主怎么解决?
我现在也在考虑是用这中方式来管理系统中的事务,之前我们是放到数据库访问层中了。但我有想到了是在每个操作DAL的方法中传入Session还是这个操作数据库的方法直接从系统中获得默认的唯一session,肯定第二种比较简洁,但同时又会遇到多线程的问题。
//开始事务
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
insertService()
....
updateService()
tx.commit();
//事务终止
}
这段代码,在函数中创建了一个Session,里面调用的两个函数确没有接受这个Session参数。估计楼主的是在这两个函数里面调用了得到当前Session的方法。
所以楼主获取Session的方法应该是使用类似单例模式的方案。那么如果遇到多线程怎么办?得到的还是一个Session,而辅线程和主线程在同时用这个Session的时候,肯定会出现问题。
楼主怎么解决?
我现在也在考虑是用这中方式来管理系统中的事务,之前我们是放到数据库访问层中了。但我有想到了是在每个操作DAL的方法中传入Session还是这个操作数据库的方法直接从系统中获得默认的唯一session,肯定第二种比较简洁,但同时又会遇到多线程的问题。