iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SSM如何实现在Controller中添加事务管理
  • 545
分享到

SSM如何实现在Controller中添加事务管理

2024-04-02 19:04:59 545人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录SSM在Controller中添加事务管理1.在controller层写编程式事务【繁琐,不推荐】2.将事务配置定义在springMVC的应用上下文(spring-mvc.xml

SSM在Controller中添加事务管理

本人使用:

一般而言,事务都是加在Service层的,但也可以加在Controller层。。                        

看了不少人的博客,总结出两个方法:

  • 在controller层写编程式事务
  • 将事务配置定义在Spring MVC的应用上下文(spring-mvc.xml)中

现在具体来说说怎么实现的:

1.在controller层写编程式事务【繁琐,不推荐】

spring-mybatis.xml中事物管理器的配置依旧

<!-- 配置数据源事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"  ref="dataSource"/>
</bean> 
<!-- 
    注解方式配置事务 @Transactional
    但因为是在controller中写编程式事务,这里可以不配置<tx:annotation-driven transaction-manager="transactionManager" />
-->
<tx:annotation-driven transaction-manager="transactionManager" />

在controller中的方法里编写事务

//在每个controller中注入transactionManager
@Resource
private PlatfORMTransactionManager transactionManager;
 
@PostMapping(value = "setCode")
@ResponseBody
public void setCode(Invoice invoice, InvoiceAddress invoiceAddress,String token,String orderIDs,
                    Integer pid,httpservletResponse response){ 
    DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
    defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);
 
    try {
        invoiceService.insert(token,pid,invoice);
        int iID= invoice.getId();
        String substring = orderIDs.substring(0, orderIDs.length()-1);
        String[] split = substring.split(",");
        for (String string2 : split) {
            bOrderService.updateIStatus("1",string2);
        }
        invoiceOrderService.insert(iID,substring);
        if(Integer.parseInt(invoice.getiType())==1){
            invoiceAddressService.insert(iID,invoiceAddress);
        }
 
        System.out.println("======制造一个运行时异常aa======");
        System.out.println("运行时异常:"+100/0);
 
        //没有异常便手动提交事务
        transactionManager.commit(status);
        printJSON(response,result(200,"ok"));
    }catch (Exception e){
        //有异常便回滚事务
        transactionManager.rollback(status);
        e.printStackTrace();
        printjson(response,result(500,"false"));
    } 
}

2.将事务配置定义在Spring MVC的应用上下文(spring-mvc.xml)中【简单明了、一劳永逸】

spring-mybatis.xml中事物管理器配置不变

在spring-mvc.xml中也定义事务配置:

<!--
    命名空间中 加入:
    xmlns:tx="Http://www.springframework.org/schema/tx"    
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
-->
<tx:annotation-driven/>

将@Transactional(rollbackFor = { Exception.class })注解打在Controller上

@Controller
@RequestMapping(value = "/invoiceC")
@Transactional(rollbackFor = { Exception.class })
public class InvoiceController extends BaseController {  
    @Autowired
    private InvoiceService invoiceService;
 
    @Autowired
    private InvoiceOrderService invoiceOrderService;
 
    @Autowired
    private InvoiceAddressService invoiceAddressService;
 
    @Autowired
    private BalanceRechangeOrderService bOrderService;    
 
    @PostMapping(value = "setCode")
    @ResponseBody
    public void setCode(Invoice invoice, InvoiceAddress invoiceAddress,String token,String orderIDs,
                        Integer pid,HttpServletResponse response){
        invoiceService.insert(token,pid,invoice);        
        int iID= invoice.getId();
        String substring = orderIDs.substring(0, orderIDs.length()-1);//截取最后一个
        String[] split = substring.split(",");//以逗号分割 
        for (String string2 : split) {
            bOrderService.updateIStatus("1",string2);
        } 
        invoiceOrderService.insert(iID,substring); 
        if(Integer.parseInt(invoice.getiType())==1){
            //纸质发票,收货地址
            invoiceAddressService.insert(iID,invoiceAddress);
        } 
        System.out.println("======制造一个运行时异常aa======");
        System.out.println("运行时异常:"+100/0);
        printJson(response,result(200,"ok")); 
    }
}

现在,我们来谈谈为什么之前??==》

  • 在spring-mybatis.xml的<aop:config>添加对Controller的声明式事务拦截
  • 在Controller的class加上@Transactional

两者均未生效呢???

原理:因为spring容器和spring-mvc是父子容器。在服务器启动时,会先加载WEB.xml配置文件 ==> 再加载spring配置文件 ==> 再回到web.xml【加载监听器;加载过滤器;加载前端控制器】==>再加载springMVC配置文件

在Spring配置文件中,我们扫描注册的是service实现类,就算扫描注册了controller 也会在后面加载SpringMVC配置文件[扫描注册controller]覆盖掉,所以想要在controller中实现事务管理,仅在spring配置文件配置<tx:annotation-driven>或<aop:config>是没有效果的,必须将事务配置定义在Spring MVC的应用上下文(spring-mvc.xml)中。

因为在spring-framework-reference.pdf文档中说明了:                                                                                                                                    

<tx:annoation-driven/>只会查找和它在相同的应用上下文件中定义的bean上面的@Transactional注解

SSM下Controller层的事务配置问题

在写项目过程中遇到了多表联合修改数据时的事务问题,按照之前的学习,事务都是配置在service层中的,但是我的项目模块里一个service对应一个数据表,所以想在controller层加一个针对多个表的数据修改以及添加的事务配置。悲惨的是,在controller层配置事务出错没有回滚!

按照我已所接触的逻辑,控制层是不建议写业务逻辑的,所以在里面调用的是多个service层的接口(使用Autowired)来调用多个表的业务操作。但是多个表形成一个事务,所以我没找在service层里单独添加事务的合适的方法。如果有前辈想到合适的方法,望赐教!叩谢!

解决

原来的配置

首先是在service层上添加事务的配置,我这里的事务处理采用的是注解的方式,所以配置文件相较于配置事务的方式大大简化了。

首先命名空间中加入:

xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd

然后是xml文件的配置:

  <!-- service除了业务(操作dao)还要有事务 -->
  <tx:annotation-driven
  transaction-manager="txManager" />
  <!-- 配置Spring的声明式事务管理器 -->
  <bean id="txManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
  </bean>

其中,数据源我是配置在了dao层的配置文件中,由于都在spring的管理之下,所以在service直接使用是能够找到的。

以下是我的maven依赖的jar包版本: 

 <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.1.5.RELEASE</version>
  </dependency>
  <!-- Spring jdbc事务管理 -->
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.5.RELEASE</version>
  </dependency>

以上是我起初的配置。但是仅仅这样是无法在controller层添加事务的。

修正后的配置

在service层的配置文件不变的情况下,我们想要在controller层添加事务,只需要在spring-mvc.xml中引入事务的注解驱动标签即可。

<!--在xml文件头部引入命名空间,参考serviice层-->
<tx:annotation-driven/>

为什么会这样?

首先我们来看配置文件的加载:

  <!-- 配置前端控制器 -->
  <servlet>
  <servlet-name>DispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>DispatcherServlet</servlet-name>
  <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  <!-- 配置spring容器加载的监听器 -->
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-*.xml</param-value>
  </context-param>

以上是我的web.xml的部分配置。在项目启动过程中,加载spring-mvc.xml是使用DispatcherServlet加载的,而加载spring-service.xml与spring-dao.xml使用的是ContextLoaderListener。

然后我们需要知道的是,ContextLoaderListener是早于DispatcherServlet启动的,而在ContextLoaderListener加载service层配置时controller并没有加载到容器中,但是此时事务的动态代理已经切入到了service层,所以后续的controller层并没有被增强。

因此,我们需要在controller层再次加入 <tx:annotation-driven/>。

仅为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SSM如何实现在Controller中添加事务管理

本文链接: https://www.lsjlt.com/news/140618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SSM如何实现在Controller中添加事务管理
    目录SSM在Controller中添加事务管理1.在controller层写编程式事务【繁琐,不推荐】2.将事务配置定义在SpringMVC的应用上下文(spring-mvc.xml...
    99+
    2024-04-02
  • SSM怎么实现在Controller中添加事务管理
    这篇文章主要介绍“SSM怎么实现在Controller中添加事务管理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SSM怎么实现在Controller中添加事务管理”文章能帮助大家解决问题。SSM在...
    99+
    2023-06-29
  • 如何在dos中添加管理帐户
    在dos中添加管理帐户的方法:1.打开dos窗口;2.输入“net user”命令查看当前所有用户;3.输入“net user 用户名 密码 /add”;4.输入“net user”显示当前所有用户;5.输入“net localgroup ...
    99+
    2024-04-02
  • 在Vue中如何实现添加全局store
    小编给大家分享一下在Vue中如何实现添加全局store,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Vue添加全局store在命令行中输入安装npm install --save vuex在m...
    99+
    2023-06-29
  • 如何在Oracle中执行事务管理
    在Oracle中执行事务管理可以通过使用以下方法: 使用BEGIN和END语句来定义事务的开始和结束。在BEGIN和END语句之...
    99+
    2024-04-09
    Oracle
  • jsp支持如何实现添加在Spring boot中
    今天就跟大家聊聊有关jsp支持如何实现添加在Spring boot中 ,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。spring boot添加对jsp的支持,以下是pom.xml文件...
    99+
    2023-05-31
    springboot spring boo jsp
  • 如何在java中使用Connection管理事务
    本篇文章给大家分享的是有关如何在java中使用Connection管理事务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可...
    99+
    2023-06-14
  • 如何在CentOS中安装EPEL包管理器及添加EPEL源
    这篇文章主要介绍“如何在CentOS中安装EPEL包管理器及添加EPEL源”,在日常操作中,相信很多人在如何在CentOS中安装EPEL包管理器及添加EPEL源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如...
    99+
    2023-06-10
  • 如何通过U盘实现本机添加管理员权限
    这篇文章主要介绍如何通过U盘实现本机添加管理员权限,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本机添加管理员权限 1,你得做一个U盘启动盘(解压镜像文件到U盘里面,有六个字文件) 2,插入U盘,设置通过U盘启动,进...
    99+
    2023-06-08
  • 在springmvc中使用controller如何实现返回值
    这篇文章将为大家详细讲解有关在springmvc中使用controller如何实现返回值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用@RequestBody 比如代码如下:@...
    99+
    2023-05-31
    springmvc controller roller
  • 如何在PHP项目中实现图片处理和水印添加?
    如何在PHP项目中实现图片处理和水印添加?近年来,随着互联网的快速发展,图片的使用在网页设计和应用开发中扮演了越来越重要的角色。为了满足用户对高质量图片的需求,我们需要在PHP项目中实现图片处理和水印添加的功能。本文将介绍一种简单而有效的方...
    99+
    2023-11-02
    图片处理 PHP项目 水印添加
  • 如何实现jQuery添加删除按钮Click事件
    这篇文章主要为大家展示了“如何实现jQuery添加删除按钮Click事件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现jQuery添加删除按钮Click...
    99+
    2024-04-02
  • 如何实现基于Java SSM的健康管理小程序
    这篇文章主要为大家展示了“如何实现基于Java SSM的健康管理小程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于Java SSM的健康管理小程序”这篇文章吧。一、系统的简介开发语...
    99+
    2023-06-25
  • 如何在Mysql中实现事务ACID
    这期内容当中小编将会给大家带来有关如何在Mysql中实现事务ACID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原子性根据定义,原子性是指一个事务是一个不可分割的工作单...
    99+
    2024-04-02
  • wxPython中wx.gird.Gird添加按钮如何实现
    这篇文章主要介绍了wxPython中wx.gird.Gird添加按钮如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇wxPython中wx.gird.Gird添加按钮如何实现文章都会有所收获,下面我们一起...
    99+
    2023-07-05
  • 如何在Spring中使用声明式事务管理
    本篇文章为大家展示了如何在Spring中使用声明式事务管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基于TransactionProxyFactoryBean的事务管理配置Spring中配置AO...
    99+
    2023-05-31
    spring 声明式事务管理
  • 如何在Oracle数据库中进行事务管理
    在Oracle数据库中进行事务管理可以通过以下步骤实现: 开始事务:在执行需要进行事务管理的操作之前,使用BEGIN TRANS...
    99+
    2024-04-09
    Oracle
  • 如何在Android中实现一个在图片中添加文字功能
    这篇文章给大家介绍如何在Android中实现一个在图片中添加文字功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android自定义实现图片加文字功能分四步来写: 1,组合控件的xml; 2,自定义组合控件的属性; ...
    99+
    2023-05-31
    android roi %d
  • 如何利用Redis实现分布式事务管理
    如何利用Redis实现分布式事务管理引言:随着互联网的快速发展,分布式系统的使用越来越广泛。在分布式系统中,事务管理是一项重要的挑战。传统的事务管理方式在分布式系统中难以实现,并且效率低下。而利用Redis的特性,我们可以轻松地实现分布式事...
    99+
    2023-11-07
    管理 redis 分布式事务
  • Spring 中的事务管理如何使用注解实现配置
    Spring 中的事务管理如何使用注解实现配置?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用步骤:步骤一、在spring配置文件中引入<tx:>命名空间&l...
    99+
    2023-05-31
    spring 注解 事务管理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作