`

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层对象继承调用这个基类就可以了。

2
2
分享到:
评论
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,肯定第二种比较简洁,但同时又会遇到多线程的问题。
2 楼 charles751 2009-01-12  
Spring的@Transactional本质上也是对业务逻辑添加事务控制,
只是代码中没有出现事务处理的代码而已。

这里只是介绍事务的方法之间相互调用时,应该怎样处理,
以及事务范围的划分。
1 楼 yeminping 2009-01-12  
用Spring的@Transactional不是更简单?

相关推荐

Global site tag (gtag.js) - Google Analytics