聲明式事務管理詳解

来源:http://www.cnblogs.com/LarryBlogger/archive/2016/10/17/5969943.html
-Advertisement-
Play Games

spring的事務處理分為兩種: 1、編程式事務:在程式中控制事務開始,執行和提交;(不建議使用,所以這裡我就不說明太多) 2、聲明式事務:在Spring配置文件中對事務進行配置,無須在程式中寫代碼;(建議使用) 我對”聲明式“的理解是這樣的:Spring配置文件中定義好了這樣一個規則, 這個規則可 ...


 

  spring的事務處理分為兩種:

    1、編程式事務:在程式中控制事務開始,執行和提交;(不建議使用,所以這裡我就不說明太多)    

    2、聲明式事務:在Spring配置文件中對事務進行配置,無須在程式中寫代碼;(建議使用)         我對”聲明式“的理解是這樣的:Spring配置文件中定義好了這樣一個規則,       這個規則可以指定對哪些類的哪些方法在執行的時候添加事務控制,並配置好了事務的相關執行屬性,       就是在這些類的這些方法執行的時候隱式地添加事務開始、執行、提交或回滾的代碼(當然我們看不到)       聲明式事務又分了兩種寫法:         2.1、xml配置文件         2.2、註解    下麵我們首先講解下在xml配置文件中如何配置聲明式事務管理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"    
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xmlns:p="http://www.springframework.org/schema/p"  
        xmlns:aop="http://www.springframework.org/schema/aop"   
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:jee="http://www.springframework.org/schema/jee"  
        xmlns:tx="http://www.springframework.org/schema/tx"  
        xsi:schemaLocation="    
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd  
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    <!-- 類似於財務部門一樣,類就是錢,所有需要類的實例都由srping去管理 -->
    <!-- <context:component-scan>:
        有一個use-default-filters屬性,該屬性預設為true,
        這就意味著會掃描指定包下的全部的標有註解的類,並註冊成bean.
        可以發現這種掃描的粒度有點太大,如果你只想掃描指定包下麵的Controller,
        該怎麼辦?此時子標簽<context:incluce-filter>就起到了勇武之地。如下所示
        <context:component-scan base-package="news" use-default-filters="false">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        如果use-dafault-filters在上面並沒有指定,預設就為true,
        也就意味著你現在加<context:exclude-filter/>跟沒加是一樣的
        所有你要記住,你若想要用到<context:component-scan>的子標簽,
        必須要把use-dafault-filters的值改為false
        當然還有一個是與之相反的而已這裡就不啰嗦了
        上面這一對解釋換成一句話就是:
            Use-dafault-filters=”false”的情況下:<context:exclude-filter>指定的不掃描,<context:include-filter>指定的掃描
    <context:component-scan>的base-package屬性作用:設置要被掃描的包 -->
    
    <!-- (本案例不用到,只是用了一個全盤掃描,以上內容只是為了讓大家瞭解它) -->
    
    <context:component-scan base-package="news.."/>
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- <tx:annotation-driven transaction-manager="transactionManager"/> -->

    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- 每300秒檢查所有連接池中的空閑連接 -->
        <property name="idleConnectionTestPeriod" value="300"/>
        <!-- 最大空閑時間,900秒內未使用則連接被丟棄。若為0則永不丟棄 -->
        <property name="maxIdleTime" value="900"/>
        <!-- 最大連接數 -->
        <property name="maxPoolSize" value="2"/>
    </bean>
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>news/entity/News.hbm.xml</value>
            </list>
        </property>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
         <!--  創建事務管理器, 管理sessionFactory(因為所有的session都是從sessionFactory獲取的) -->
         <property name="sessionFactory" ref="sessionFactory" />
     </bean>
    <!--  配置通知, 那些方法需要切入什麼類型的事務 -->     
    <tx:advice id="advice" transaction-manager="transactionManager">
         <tx:attributes>
             <tx:method name="add*" propagation="REQUIRED"/>
             <tx:method name="del*" propagation="REQUIRED"/>
             <tx:method name="update*" propagation="REQUIRED"/>
             <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
         </tx:attributes>
     </tx:advice>
     
     <!-- 配置切麵表達式, 並且讓 tx與切麵表達式合二為一 -->
     <aop:config>
         <!-- 表達式, 定義哪個包的哪些類需要切入事務,但是此處並且沒有制定類中哪些方法,需要切入什麼樣 事務 -->
         <aop:pointcut expression="execution(* news.service.*.*(..))" id="pointcut" />
         <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
     </aop:config>
</beans>
            

   相信這段代碼對於我們初學者來說不是那麼容易看懂,下麵我來給大家分析吧:

    1、創建事務管理器

 

  2、配置通知

  

<tx:attributes/>
屬性 必須 預設值  描述
name   要切入的方法名,可以用通配符
propagation 不是 REQUIRED 事務傳播行為
isolation 不是 DEFAULT 事務隔離級別
timeout 不是 -1 事務超時的時間(以秒為單位)
read-only 不是 false 事務是否只讀?
rollback-for 不是   將被觸發進行回滾的 Exception(s);以逗號分開。 如:'news.serviceImpl'
no-rollback-for 不是    被觸發進行回滾的 Exception(s);以逗號分開。 如:'news.serviceImpl'
     3、配置切麵表達式, 並且讓 tx與切麵表達式合二為一 

    

  

我解釋一下execution(* news.service.*.*(..))"中幾個通配符的含義:

第一個 * —— 通配 任意返回值類型
第二個 * —— 通配 包news.service下的任意class
第三個 * —— 通配 包news.service下的任意class的任意方法
第四個 .. —— 通配 方法可以有0個或多個參數

綜上:包news.service下的任意class的具有任意返回值類型、任意數目參數和任意名稱的方法

 

 

  做到這裡xml方式的事務管理基本就做完了,還差最後一步,那就是導入它相關的缺包

    

    如果沒有這些包的朋友們可以去一下網址下載:http://pan.baidu.com/s/1eSlyY1G

 註意:
在以下情況中spring的事務管理會失效:
  ● private 方法無法添加事務管理.
  ● final 方法無法添加事務管理.
  ● static 方法無法添加事務管理.
  ● 當繞過代理對象, 直接調用添加事務管理的方法時, 事務管理將無法生效.
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET Aries 4.0 主要更新如下:1:增加AR.Global.GetUser() 方法返回當前登陸者的用戶信息。2:重寫AR.Combobox 支持下拉樹。3:調整及擴展Input下拉的配置參數。4:優化及新增AR.Combobox相關的方法。5:重寫層級表頭的配置及演算法。6:擴展下... ...
  • 1、概覽 1.1、介紹 ...
  • 上大學時學校開過一門課程就是數據結構,當時學的似懂非懂,不知道它的重要性,現在工作了,想撿起來,所以重新買了本書,重溫數據結構,我自己會記錄整個學習的過程,有興趣的同學可以一起。 今天剛看到基礎篇,也記錄下來,方便日後查看和再次回顧。 <一>你需要知道的一些名詞定義: 1.數據:數據是對客觀事物的符 ...
  • 為.net core 配一個基於html5的UI框架 傳送門:TchApp項目說明 ...
  • [ASP.NET Core] Getting Started 前言 本篇文章介紹如何快速建立一個ASP.NET Core應用程式,為自己留個紀錄也希望能幫助到有需要的開發人員。 ASP.NET Core官網 環境 建立一個ASP.NET Core應用程式,首先要從官網下載SDK來建置.NET Cor ...
  • 枚舉類型是定義了一組“符號名稱/值”配對。枚舉類型是強類型的。每個枚舉類型都是從system.Enum派生,又從system.ValueType派生,而system.ValueType又從system.Object派生,所以枚舉類型是指類型。 編譯枚舉類型時,C#編譯器會把每個符號轉換成類型的一個常 ...
  • 上一章我們講到關於C#線程方向的應用。但是筆者並沒有講到多線程中的另一個知識點——同步。多線程的應用開發都有可能發生臟數據。同步的功能或多或少都會用到。本章就要來講一下關於線程同步的問題。根據筆者這幾年來的.NET開發可以瞭解到的同步方式至少有四種以上。如。lock、volatile、Monitor ...
  • VS中如何快捷地給自己的代碼添加創建信息註釋 Intro 以下討論的都是沒有使用 GIT 來管理源代碼的情況,如果使用 GIT 管理源代碼可直接使用VS的Git擴展就不需要考慮以下問題。 什麼是創建信息註釋? 創建信息註釋,類似於文件的創建信息,一般來說,至少要有創建人和創建時間。如果說有人修改了方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...