关于Spring事务控制方面的问题,就是不在service层做控制
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 06:50:11
关于Spring事务控制方面的问题,就是不在service层做控制
现在我在写一个小系统,需要引入事务控制相关的东西.
原来与spring事务都是在service层做的,现在我这个系统有需求是在controller层(action层)做事务控制,请问这个可能吗?还有有没有具体的实现方法和事例.
现在我在写一个小系统,需要引入事务控制相关的东西.
原来与spring事务都是在service层做的,现在我这个系统有需求是在controller层(action层)做事务控制,请问这个可能吗?还有有没有具体的实现方法和事例.
同意1楼的兄弟说的,业务逻辑应该由service处理,造成需要在action开启事务的最根本原因主要是你的组件层API设计有问题,action中不该处理业务逻辑代码的,需要调多个service完成的功能其实就是一个业务,不过不按1楼说的把action放到spring托管也有办法在action手动开启事务,下边是我以前写的代码,当时是为了解决遗留系统的事务问题,你可以参考测试一下:
public interface ITransactionManager {
/**
* 该方法中是需要进行事务控制的内容
* @return
* @throws Exception
*/
Object doInTransaction() throws Exception;
}
public class DataSourceTransactionUtil {
public Object execute(final ITransactionManager transactionManager){
DataSourceTransactionManager dataSourceTransactionManager = getDataSourceTransactionManager();
TransactionTemplate transactionTemplate = new TransactionTemplate(dataSourceTransactionManager);
return transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus transactionStatus) {
Object savepoint = transactionStatus.createSavepoint();
Object result = null;
try{
result = transactionManager.doInTransaction();
} catch(Exception e){
transactionStatus.rollbackToSavepoint(savepoint);
e.printStackTrace();
} finally{
transactionStatus.releaseSavepoint(savepoint);
}
return result;
}
});
}
private DataSourceTransactionManager getDataSourceTransactionManager(){
return (DataSourceTransactionManager)getBean("transactionManager");
}
}
解释一下:
这段代码我记得是看了spring源码后自己写的.
1、getBean("transactionManager");是获得spring中事务管理器那个bean,你自己改名字.
2、把这段代码放到你的BaseAction中:
protected Object beginTransaction(ITransactionManager transactionManagerImpl){
DataSourceTransactionUtil dt = new DataSourceTransactionUtil();
return dt.execute(transactionManagerImpl);
}
3.在你需要开启事务的action中调用beginTransaction方法transactionManagerImpl这个对象你写个匿名内部类然后实现doInTransaction() 方法,在doInTransaction() 中去写你调用多个service的代码
public interface ITransactionManager {
/**
* 该方法中是需要进行事务控制的内容
* @return
* @throws Exception
*/
Object doInTransaction() throws Exception;
}
public class DataSourceTransactionUtil {
public Object execute(final ITransactionManager transactionManager){
DataSourceTransactionManager dataSourceTransactionManager = getDataSourceTransactionManager();
TransactionTemplate transactionTemplate = new TransactionTemplate(dataSourceTransactionManager);
return transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus transactionStatus) {
Object savepoint = transactionStatus.createSavepoint();
Object result = null;
try{
result = transactionManager.doInTransaction();
} catch(Exception e){
transactionStatus.rollbackToSavepoint(savepoint);
e.printStackTrace();
} finally{
transactionStatus.releaseSavepoint(savepoint);
}
return result;
}
});
}
private DataSourceTransactionManager getDataSourceTransactionManager(){
return (DataSourceTransactionManager)getBean("transactionManager");
}
}
解释一下:
这段代码我记得是看了spring源码后自己写的.
1、getBean("transactionManager");是获得spring中事务管理器那个bean,你自己改名字.
2、把这段代码放到你的BaseAction中:
protected Object beginTransaction(ITransactionManager transactionManagerImpl){
DataSourceTransactionUtil dt = new DataSourceTransactionUtil();
return dt.execute(transactionManagerImpl);
}
3.在你需要开启事务的action中调用beginTransaction方法transactionManagerImpl这个对象你写个匿名内部类然后实现doInTransaction() 方法,在doInTransaction() 中去写你调用多个service的代码