问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于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层应该最好。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 oracle 在一个事务中设置了好几个savepoint, 如何查询到前面所创建的savepoint的名称 海凉粉怎么做如何做好吃 redmi+watch+2与Haylou+RS4相比 相比于haylou GTS,haylou RS4有哪些进步的地方? haylours4可以打电话吗 以蜂蜜为原料能做哪些食品 2022年母婴店的工作计划 我有对方的但是没他的手机请问怎么能看到微信的聊天记录..._百度问一问 骨关节炎能不能被彻底治愈? 鲫鱼几个塞 网上哪有最新的ie浏览器下载? ie浏览器下载 最新版ie浏览器下载 最好用的ie浏览器下载 2010ie浏览器下载 最新的ie浏览器是?希望能给个下载地址 和平精英怎么改空白名字,输入12星座符号显示太短了 和平精英输入口令为什么有空格 上海建桥大学怎么样?几本?2010年分数线? 老头被下泻药的电影或电视剧 内容大概是提到了西北大学,一个学生被下了泻药等内容,不知道具体是什么名字,求解答 有什么小说有老头被下泻药情节的,具体章节 那些电视剧或电影(中国外国都可以)有女生被下泻药或者拉肚子的场景?感谢大神 能代表企业精神的口号或标语,是要挂在大门口的!(是一个工业企业,叫恒通) 公司门口的LED显示器上的标语有什么好的么?大神们帮帮忙 企业门口题什么字好 工人准备到公司门口举横幅讨薪,怎样写横幅语? 为什么我买东西说好是免运费但领快递的时候要交两块钱运费? 年丰大当家买东西不论多少钱都是免运费的吗? 在淘宝买东西时说满多少元免运费,我怎么知道他有没有免运费? 华就路31号(地铁三号线珠江新城站)怎么去 广州市不动产登记中心咨询电话 请问:广州不动产登记部门是否可以对“居住权”进行登记,有哪些要求?_百度问一问 请问以太广场到珠江新城华就路31号怎么走? 广州市不动产登记中心咨询电话请问:广州不动产登记部门是否可以对“居住权”进行登记,有哪些要求?_百度问一问 麻烦各位帮我提供下广州市各区房管局的电话 广州市国土房管局的地址!在哪里?在哪个区啊? 广州市如何办理首套购房证明 广州市房地产交易登记中心工会委员会怎么样? 广州市萝岗区开无房证明去哪个部门开?地址在哪里 我父亲前段时间过世了,广州市房产证写的是父母的名字,现在想把父亲的名字取消,要去哪里办理手续呢? 1.请问在广州越秀区的房子,关于房产证过户,继承手续,是在哪里办理呢?谢谢.. 广州市 越秀区 个人名下房产证明 要到哪里办理,要携带哪些文件? 请问广州集体户口购房所需的资料及办理步骤(详细的),谢谢!急