SSM如何实现在Controller中添加事务管理
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包版本: 以上是我起初的配置。但是仅仅这样是无法在controller层添加事务的。 修正后的配置 在service层的配置文件不变的情况下,我们想要在controller层添加事务,只需要在spring-mvc.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包版本:
以上是我起初的配置。但是仅仅这样是无法在controller层添加事务的。
修正后的配置
在service层的配置文件不变的情况下,我们想要在controller层添加事务,只需要在spring-mvc.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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~