关于Spring事务控制方面的问题,就是不在service层做控制
发布网友
发布时间:2022-05-15 21:20
我来回答
共3个回答
热心网友
时间:2024-03-19 06:37
同意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的代码
热心网友
时间:2024-03-19 06:38
调用的service层方法不要加事务,直接试试用@transaction到controller层方法呢。
controller层一个业务方法调用多个service层方法,是完全正常的,controller层仅仅做业务逻辑处理而不调用多个service层方法太少了。可以事务用于controller层,自己的理解:一个controller层的方法才是真正的业务方法,才是一个完整的业务块,数据就应该一致,所以事务就该加在该层(讨论交流,允许不一样的声音?)
热心网友
时间:2024-03-19 06:38
做是肯定可以。但是不怎么好。
首先action应该只有具有请求services与基本逻辑控制,真正的业务处理与数据交互应该是放在service层。所以事物在这里再好不过了。建议考虑一下
如果要配置,把之前spring配置路径改成action的,然后在方法上加上Transactional注解就可以了吧。不知道你系统是不是这样。谢谢。追问是的,我看到大部分都是放在service层的,不过我现在一个action方法里面一般都有几个service方法的调用 ,要这些全部成功了,成一次提交到数据库的,所以 我才想到在action层上做事务控制的,不知道这样会有什么后果
追答这个问题。所以说还是跟程序的结构有关。
如果你action没有多个service方法。而是将其在service层统一处理。现在也没这些事。
配置在action层没什么后果、只是你的结构对于MVC设计模式不是很规范而已。
就是说你现在配置在action层应该最好。