springmvc中controller的作用,spring中@controller作用
00-1010 Spring MVC中的事务可以添加到控制器层吗?Spring在控制器层的事务操作如下。
00-1010一般来说,事务是加到服务层的,但是我经常在想,有没有可能把事务加到控制器层。
我一直试图证明事务不仅可以添加在服务层,也可以添加在控制器层,但是我一直没有找到有力的论据来支持我的想法,这让我认为事务只能添加在服务层。直到我看了spring的官方文档并付诸实践,我才知道我的想法是对的。
在spring-framework-reference.pdf文档中有这样一段话:
tx :批注驱动/仅在定义它的同一应用程序上下文中查找beans上的@Transactional。这意味着,如果您将tx:annotation-driven/放入DispatcherServlet的WebApplicationContext中,它只会检查控制器中的@ Transactional beans,而不会检查服务。
这句话的意思是tx : annotation-Driven/只会在与它定义在相同应用程序上下文中的bean上寻找@Transactional注释。如果将它放在Dispatcher的应用程序上下文中,它将只检查控制器上的@Transactional注释,而不检查服务上的@Transactional注释。
于是,我在Spring MVC的应用上下文中定义了事务配置(*-servlet.xml),在控制器上标记了@Transactional注释,最后事务工作了。
综上所述,在Spring MVC中,事务不仅可以添加到服务层,还可以添加到控制器层(虽然不推荐这样做,但至少满足了我的好奇心,(* _ _ *)嘻嘻……)。
记录下自己的情况。当时相当于二次开发,什么都配置好了。但是很可惜只有一个控制器层。当时没什么感觉,就写在控制器里了。报告错误后发现事务没有回滚,很尴尬。第一,在配置文件中配置事务,写注释,显得我很傻。
看完这篇文章,我发现我自己的业务是在spring的配置文件中配置(一般在这里),但是我只有控制器层,所以我要在spring-mvc的配置文件中配置。换个配置就好了。
此外,该项目配置了双数据源。这里有一张便条。
!-(事务管理)事务管理器,使用JtaTransactionManager for global tx-bean id= transactionManagerMS class= org . spring framework . JDBC . data source . data source transactionmanager property name= data source ref= data source ms //bean!-事务可以由批注控制-tx 3360批注驱动的事务-manager= transaction manager /!-(事务管理)事务管理器,使用JtaTransactionManager for global tx-bean id= Transaction manager class= org . spring framework . JDBC . data source . datasourcetransactionmanager property name= data source ref= data source //bean!-事务可以由批注控制-tx 3360批注驱动的事务-manager= transaction manager /使用时只需批注事务性。但是,如果一个控制器中涉及两个数据库的事务,则只能手动启动这些事务。
目录
作
以下是代码
package cn.hr.controller;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.DefaultTransactionDefinition;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import cn.hr.base.action.BaseAction;import cn.hr.service.IAnnualbonuService;@Controller@RequestMapping(value="/demoTest")public class DemoTestController extends BaseAction<Object>{ @Autowired private IAnnualbonuService annualbonuService; @Autowired private PlatformTransactionManager transactionManager; /** * * @param payNamelist * @param request * @param response * @param session */ @RequestMapping(value = "/deletePayNamelist",method = RequestMethod.POST) public void deletePayNamelist(HttpServletRequest request, HttpServletResponse response,HttpSession session) { PrintWriter out = null; TransactionStatus status = this.transaction(); try { //=====================业务逻辑处理地方================================ out=response.getWriter(); out.write("0"); out.flush(); transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); out.write(""); out.flush(); logger.error(e); }finally{ out.flush(); out.close(); } } private TransactionStatus transaction(){ DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition(); defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition); return status; }}
主要是transaction这个方法,意思是:new 一个新的事务,再设置自己所需要的事务隔离级别,最后通过注入的transactionManager得到该事务即可。
百分百生效!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。