如何在Controller层实现事务管理?

2023-11-19

spring aop 事务管理中发现,我们是在service层实现的事务管理。
现在有如下场景,大家讨论下看如何实现?
ControllerA、ControllerB、ControllerC….共同依赖ServiceA、ServiceB,上述Controller的save操作需要把数据同步ServiceA和ServiceB。
由于每个Controller保存ServiceB的extraData字段是通过Json组装的,所以每个Controller具有独特性。如果在Service层实现事务管理,ServiceA将会变的异常庞大,需要判断是哪个Controller过来的数据,然后组装ServiceB的extraData字段。
另一种思路,我们是否可以把每个Controller组装ServiceB的extraData字段过程放在各自的Controller,然后在Controller实现事务管理呢?
经过测试,在Controller层加事务,在spring.xml的aop:config添加对Controller的声明式事务拦截,结果未生效。在Controller的class加上@Transactional也未生效。最后采取的编程式事务实现的。
我们在Spring.xml配置sessionFactory和transactionManager,如果已经配置声明式事务,这步可以忽略。

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="c3p0DataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">#{ nplat['db.dialect'] }</prop>
                <prop key="hibernate.hbm2ddl.auto">none</prop>
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.max_fetch_depth">3</prop><!-- 抓取的级联深度 -->
                <prop key="hibernate.jdbc.fetch_size">50</prop><!-- 批量抓取的数量.mysql不支持 -->
                <prop key="hibernate.jdbc.batch_size">30</prop><!-- 批量写入的数量 -->
                <prop key="javax.persistence.validation.mode">none</prop><!-- HiberV3.5以上需配置该项 -->
                <!-- <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop 
                    key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
                    强制Hibernate以更人性化的格式将数据存入二级缓存 <prop key="hibernate.cache.use_structured_entries">true</prop> -->
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.gina.gc</value>
            </list>
        </property>
    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

然后在每个Controller注入transactionManager:

@Resource
private PlatformTransactionManager transactionManager;

下面讲解如何在Controller的save方法加上编程式事务:

@RequestMapping("/save")
@ResponseBody
public String save(@Validated BaseSetting info) {
    DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
    defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);

    try {
        serviceA.save(A);
        serviceB.save(B);
        ...

        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        e.printStackTrace();
        log.error("sava *** error" + e.toString());
        return ERROR(e.toString());
    }
    return OK();
}

这样我们便实现了在Controller层加上事务管理。
虽说大家建议把事务加在Service,但不同情况不同处理方案,真正到项目中还得综合考虑,灵活运用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Controller层实现事务管理? 的相关文章

随机推荐

  • 使用antd pro初始化项目时出现报错:

    npm i ant design pro cli g出现报错 解决 使用sudo tnpm i ant design pro cli g 接着pro create myapp 一切都很顺利 但是在tnpm install时出现报错 这个问题
  • C51简介及Keil的使用

    前言 此文档主要是针对有一定C C 编程基础 并打算用Keil从事C51开发的开发人员 C51涉及的知识比较多 但是入门基本的开发 还是容易的 C51简介 1 C51概念 C51继承于C语言 主要运行于51内核的单片机平台 单片机 单片微型
  • Linux环境搭建----VMware安装虚拟机

    一 VMare虚拟机安装与使用 1 1 VMware简介 1 VMware是一个虚拟PC的软件 可以在现有的操作系统上虚拟出一个新的额硬件环境 相当于模拟出一个新的PC 2 WMware官方网站 http www vmware com 3
  • python重复执行命令_怎样能重复执行一条命令直到运行成功

    在我们的日常工作中 需要我们重复做的工作简直不能太多 比如 我们想要确认网络是否是连通的 传统的做法就是使用 ping 命令不停去测试某个地址 比如百度 网络比较好还好说 但如果网络很差 那么就需要一直去运行 ping 命令 作为程序员 重
  • 双链表嵌套的简单学生信息管理系统

    参考 实现双链表嵌套的简单学生信息管理 作者 三速何时sub20 发布时间 2020 07 20 10 44 40 网址 https blog csdn net weixin 44234294 article details 1074581
  • C++内联函数

    C 内联函数 1 什么是函数 函数是一个可以重复使用的代码块 CPU 会一条一条地挨着执行其中的代码 CPU 在执行主调函数代码时如果遇到了被调函数 主调函数就会暂停 CPU 转而执行被调函数的代码 被调函数执行完毕后再返回到主调函数 主调
  • PCL 基于迭代双边滤波的点云平滑

    目录 一 算法原理 1 原理概述 2 主要函数 3 参考文献 二 代码实现 三 结果展示 一 算法原理 1 原理概述 点云双边滤波的算法原理和详细实现过程见 PCL 基于法线的双边滤波 具体实现效果如下图所示 绿色为平滑前的点云 红色为平滑
  • 区块链产业生态发展情况-中国区块链产业生态发展

    2019以来中国区块链产业处于蓬勃发展期 从中央到地方有关区块链发展的指导意见和扶持政策不断发布 据不完全统计 今年上半年全国共有超过23个省市发布了112条涉及区块链的政策信息 多省市把区块链纳入发展数字经济的规划中 大力推进区块链应用落
  • 2023电赛E题:OpenMV4的矩形识别与中心判断

    增加识别率 使用OpenMV4官方的矩形识别案例 发现识别率很低 经常乱识别 为了增加识别率 加入最大矩形块的判断 让其只识别最大的矩形块 发现识别率高了很多 矩形起点识别与中心判断 接着是矩形起点和矩形中心判断 通过矩形类自带的矩形4元素
  • 数据降维

    数据降维 MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 目录 数据降维 MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 基本介绍 模型描述 程序设计 学习小结 基本介绍 MATLAB实现基于LFDA
  • signature今日头条php实现,今日头条_signature 值解析算法,另带DEMO_精易论坛

    navigator WT JS DEBUG v1 7 5 NLiger2018 appCodeName Mozilla appMinorVersion 0 appName Netscape appVersion 5 0 Windows NT
  • 【无标题】PPTP和L2TP服务器iPhone和PC VPN同时接入设置

    PPTP和L2TP服务器iPhone和PC VPN同时接入设置 VPN 用户管理 添加PPTP和L2TP用户 这样iPhong使用L2TP拨号 因为苹果禁用PPTP PC使用PPTP拨号 因为PPTP比L2TP上网速度快
  • IIS7.5文件解析漏洞&&Apache解析漏洞&&Nginx文件解析漏洞&&

    实验原理 文件上传使用白名单做限制 只能上传图片文件 导致脚本文件无法上传 上传图片马绕过白名单文件上传的验证 但是图片马又无法解析 利用IIS7 5文件解析漏洞的特点 任意文件名 任意文件名 php 从而解析脚本文件 实验步骤 1 登录操
  • 怎样使用Finder从MacOS Catalina删除iPhone和iPad备份?

    是否需要清理一些磁盘空间或摆脱Mac上的某些旧iPhone或iPad备份 备份iPhone或iPad最安全 最彻底的方法是通过Mac Finder进行加密备份 以下是在macOS Catalina中删除旧的iPhone或iPad备份的方法
  • 通过matlab实现数字图像处理中的抠图换背景功能

    适合背景为蓝色的图片 效果最好 如果背景色为别的颜色 可对代码进行调整修改后使用 其实这里的代码最开始由于报错已经经过我的修改了 可能出现的异常情况 1 待抠图片以及需要替换的背景图片放置在代码文件所在的目录 不然会无法读取 不出结果 2
  • 【安全】Apache HDFS 上配置 kerberos

    文章目录 4 3 部署kerberos keytab文件 4 4 命令测试 4 5 写个测试类测试一下 4 5 修改 hdfs 配置文件 4 5 1 常规配置 4 5 2 可选配置 4 5 2 可选配置 4 5 3 可选配置 4 5 4 注
  • ubantu16.04安装Anaconda

    1 官网下载安装包 我下载的是python 3 10版本的 后续用tvm要求python版本在 3 7 3 8 记得创建一个虚拟环境 Anaconda历史版本链接 https repo anaconda com archive 2 开始安装
  • 【项目实战】复旦微MCU+RT-thread+Moudbus(1)

    前言 手头存货FM33LC046芯片 复旦微提供的是freertos和rthread nano的例子 一直想使用RTThread完整版 MCU由于ROM有限 项目因此不可能太复杂 怕后期资源不够 第一步 git源码https gitee c
  • Activiti-设置全局变量的四种方法

    1 在流程启动的时候设置全局变量 在流程启动时设置全局变量 Test public void startProcessInstance 得到runtimeService RuntimeService runtimeService proce
  • 如何在Controller层实现事务管理?

    在spring aop 事务管理中发现 我们是在service层实现的事务管理 现在有如下场景 大家讨论下看如何实现 ControllerA ControllerB ControllerC 共同依赖ServiceA ServiceB 上述C