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

网友投稿 335 2022-08-25


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

目录SSM在Controller中添加事务管理1.在controller层写编程式事务【繁琐,不推荐】2.将事务配置定义在SpringMVC的应用上下文(spring-mvc.xml)中【简单明了、一劳永逸】SSM下Controller层的事务配置问题解决为什么会这样?

SSM在Controller中添加事务管理

本人使用:

集成开发环境:idea项目管理工具:maven数据库:oracle框架:Spring+SpringMVC+myBatis

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

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

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

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

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

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

在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中也定义事务配置:

transaction-manager="txManager" />

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

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

org.springframework

spring-tx

5.1.5.RELEASE

org.springframework

spring-jdbc

5.1.5.RELEASE

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

修正后的配置

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

为什么会这样?

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

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

DispatcherServlet

*.action

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath:spring-*.xml

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

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

因此,我们需要在controller层再次加入

transaction-manager="txManager" />

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

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

org.springframework

spring-tx

5.1.5.RELEASE

org.springframework

spring-jdbc

5.1.5.RELEASE

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

修正后的配置

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

为什么会这样?

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

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

DispatcherServlet

*.action

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath:spring-*.xml

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

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

因此,我们需要在controller层再次加入


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2022-07-12 1252. 奇数值单元格的数目(20220712黄历)
下一篇:【python爬虫专项(2)】网页结构剖析(python爬虫分析网页)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~