关于Spring事务控制方面的问题,就是不在service层做控制
现在我在写一个小系统,需要引入事务控制相关的东西。原来与spring事务都是在service层做的,现在我这个系统有需求是在controller层(action层)做事务...
现在我在写一个小系统,需要引入事务控制相关的东西。
原来与spring事务都是在service层做的,现在我这个系统有需求是在controller层(action层)做事务控制,请问这个可能吗?还有有没有具体的实现方法和事例。 展开
原来与spring事务都是在service层做的,现在我这个系统有需求是在controller层(action层)做事务控制,请问这个可能吗?还有有没有具体的实现方法和事例。 展开
3个回答
展开全部
同意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的代码
展开全部
调用的service层方法不要加事务,直接试试用@transaction到controller层方法呢。
controller层一个业务方法调用多个service层方法,是完全正常的,controller层仅仅做业务逻辑处理而不调用多个service层方法太少了。可以事务用于controller层,自己的理解:一个controller层的方法才是真正的业务方法,才是一个完整的业务块,数据就应该一致,所以事务就该加在该层(讨论交流,允许不一样的声音?)
controller层一个业务方法调用多个service层方法,是完全正常的,controller层仅仅做业务逻辑处理而不调用多个service层方法太少了。可以事务用于controller层,自己的理解:一个controller层的方法才是真正的业务方法,才是一个完整的业务块,数据就应该一致,所以事务就该加在该层(讨论交流,允许不一样的声音?)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
做是肯定可以。但是不怎么好。
首先action应该只有具有请求services与基本逻辑控制,真正的业务处理与数据交互应该是放在service层。所以事物在这里再好不过了。建议考虑一下
如果要配置,把之前spring配置路径改成action的,然后在方法上加上Transactional注解就可以了吧。不知道你系统是不是这样。谢谢。
首先action应该只有具有请求services与基本逻辑控制,真正的业务处理与数据交互应该是放在service层。所以事物在这里再好不过了。建议考虑一下
如果要配置,把之前spring配置路径改成action的,然后在方法上加上Transactional注解就可以了吧。不知道你系统是不是这样。谢谢。
追问
是的,我看到大部分都是放在service层的,不过我现在一个action方法里面一般都有几个service方法的调用 ,要这些全部成功了,成一次提交到数据库的,所以 我才想到在action层上做事务控制的,不知道这样会有什么后果
追答
这个问题。所以说还是跟程序的结构有关。
如果你action没有多个service方法。而是将其在service层统一处理。现在也没这些事。
配置在action层没什么后果、只是你的结构对于MVC设计模式不是很规范而已。
就是说你现在配置在action层应该最好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询