最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC中事務是否可以加在Controller層的問題

 更新時間:2022年02月26日 14:38:48   作者:手不要亂摸  
這篇文章主要介紹了SpringMVC中事務是否可以加在Controller層的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringMVC中事務是否可以加在Controller層

一般而言,事務都是加在Service層的,但是愛鉆牛角尖的我時常想:事務加在Controller層可不可以。

我一直試圖證明事務不止可以加在Service層,還可以加在Controller層,但是沒有找到有力的論據來支持我這個想法,搞得我一度認為事務只能加在Service層,直到我讀過spring官方文檔并實踐之后,我知道我的想法是對的。

在spring-framework-reference.pdf文檔中有這樣一段話:

<tx:annotation-driven/> only looks for @Transactional on beans in the same application context it is defined in. This means that, if you put <tx:annotation-driven/> in a WebApplicationContext for a DispatcherServlet, it only checks for @Transactional beans in your controllers, and not your services. 

這句話的意思是,<tx:annoation-driven/>只會查找和它在相同的應用上下文件中定義的bean上面的@Transactional注解,如果你把它放在Dispatcher的應用上下文中,它只檢查控制器上的@Transactional注解,而不是你services上的@Transactional注解。

于是,我將事務配置定義在Spring MVC的應用上下文(*-servlet.xml)中,將@Transactional注解打在Controller上,終于事務起作用了。

綜上,在Spring MVC中,事務不僅可以加在Service層,同樣也可以加在Controller層(雖然不推薦這么做,但至少滿足了我的好奇心,(*^__^*) 嘻嘻……)。

記錄一下自己的情況,當時是相當于二次開發(fā),什么都是配置好的。但是很坑的是只有一個controller層,當時也沒覺得什么,就跟著在controller里面寫。結果報錯之后發(fā)現事務沒有回滾,這就很尷尬了。一檢查,配置文件里面配置了事務,注解也是寫了的,一臉懵。

讀了這篇文章后發(fā)現,自己的事務是配置在spring的配置文件(一般都是配置在這里),但是我只有controller層,那就得配置到spring-mvc的配置文件里面,換了配置后就好了。

另外,項目是配置了雙數據源。這里在記錄一下。  

<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManagerMS"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
?? ?<property name="dataSource" ref="dataSourceMS" />
</bean>
?
<!-- 可通過注解控制事務 -->
<tx:annotation-driven transaction-manager="transactionManagerMS" />
?
<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
?? ?<property name="dataSource" ref="dataSource" />
</bean>
?
<!-- 可通過注解控制事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />

用的時候通過注解Transactional 就行了。但是一個controller里面涉及到兩個數據庫的事務的話就只能手動開啟事務了 

Spring在Controller層的事務操作

以下是代碼

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 {
? ? ? ? ? ? //=====================業(yè)務邏輯處理地方================================
? ? ? ? ? ? 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得到該事務即可。

百分百生效! 

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中簡單實用Quartz概述

    Java中簡單實用Quartz概述

    Quartz是一個開源的Java調度框架,可以用來實現在指定的時間或時間間隔觸發(fā)任務執(zhí)行的功能,這篇文章主要介紹了Java中簡單實用Quartz,需要的朋友可以參考下
    2023-02-02
  • 關于文件合并與修改md5值的問題

    關于文件合并與修改md5值的問題

    這篇文章主要介紹了關于文件合并與修改md5值的問題,使用本博客的方法,不僅僅可以修改md5值,還可以達到隱藏文件的目的,需要的朋友可以參考下
    2023-04-04
  • 解決idea每次新建項目都需要重新指定maven目錄

    解決idea每次新建項目都需要重新指定maven目錄

    這篇文章主要介紹了解決idea每次新建項目都需要配置maven,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring OAuth2.0 單元測試解決方案

    Spring OAuth2.0 單元測試解決方案

    這篇文章主要介紹了Spring OAuth2.0 單元測試解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • maven項目在實踐中的構建管理之路的方法

    maven項目在實踐中的構建管理之路的方法

    這篇文章主要介紹了maven項目在實踐中的構建管理之路的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • spring security在分布式項目下的配置方法(案例詳解)

    spring security在分布式項目下的配置方法(案例詳解)

    這篇文章主要介紹了spring security在分布式項目下的配置方法,本文通過一個項目案例給大家詳細介紹,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 解決jasperreport導出的pdf每頁顯示的記錄太少問題

    解決jasperreport導出的pdf每頁顯示的記錄太少問題

    這篇文章主要介紹了解決jasperreport導出的pdf每頁顯示的記錄太少問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java如何獲取Json中的數據實例代碼

    Java如何獲取Json中的數據實例代碼

    這篇文章主要給大家介紹了關于Java如何獲取Json中數據的相關資料,我們在日常開發(fā)中少不了和JSON數據打交道,那么我們來看看JAVA中常用的JSON獲取方式,需要的朋友可以參考下
    2023-09-09
  • Java后端用EL表達式改進JSP

    Java后端用EL表達式改進JSP

    EL 全名為Expression Language,EL的語法很簡單,它最大的特點就是使用上很方便,本文帶你用EL表達式改進JSP,感興趣的朋友來看看吧
    2022-02-02
  • mybatis如何實現繼承映射

    mybatis如何實現繼承映射

    這篇文章主要介紹了mybatis如何實現繼承映射的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

桦甸市| 南漳县| 汶川县| 昭通市| 临城县| 文登市| 乌恰县| 夏河县| 大悟县| 河源市| 焉耆| 栖霞市| 塘沽区| 资讯 | 东宁县| 石棉县| 东辽县| 梓潼县| 遂昌县| 岐山县| 青河县| 淮阳县| 衡水市| 商丘市| 蓬莱市| 肇庆市| 慈溪市| 洪湖市| 班玛县| 高要市| 大兴区| 柘荣县| 宁津县| 通江县| 昆山市| 揭阳市| 石屏县| 罗江县| 合肥市| 合川市| 阳西县|