亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring中的事務管理及實現(xiàn)方式解析

 更新時間:2024年01月30日 09:59:49   作者:saint_motel  
這篇文章主要介紹了Spring中的事務管理及實現(xiàn)方式解析,Spring事務管理基于底層數(shù)據(jù)庫本身的事務處理機制,數(shù)據(jù)庫事務的基礎,是掌握Spring事務管理的基礎,這篇總結(jié)下Spring事務,需要的朋友可以參考下

1、事務認識

大家所了解的事務Transaction,它是一些列嚴密操作動作,要么都操作完成,要么都回滾撤銷。

Spring事務管理基于底層數(shù)據(jù)庫本身的事務處理機制。

數(shù)據(jù)庫事務的基礎,是掌握Spring事務管理的基礎。

事務具備ACID四種特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(持久性)的英文縮寫。

  •  A:原子性(Atomicity),一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務開始前的狀態(tài),就像這個事務從來沒有執(zhí)行過一樣。就像你買東西要么交錢收貨一起都執(zhí)行,要么發(fā)不出貨,就退錢。
  • C:一致性(Consistency),事務的一致性指的是在一個事務執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。如果事務成功地完成,那么系統(tǒng)中所有變化將正確地應用,系統(tǒng)處于有效狀態(tài)。如果在事務中出現(xiàn)錯誤,那么系統(tǒng)中的所有變化將自動地回滾,系統(tǒng)返回到原始狀態(tài)。
  • I:隔離性(Isolation),指的是在并發(fā)環(huán)境中,當不同的事務同時操縱相同的數(shù)據(jù)時,每個事務都有各自的完整數(shù)據(jù)空間。由并發(fā)事務所做的修改必須與任何其他并發(fā)事務所做的修改隔離。事務查看數(shù)據(jù)更新時,數(shù)據(jù)所處的狀態(tài)要么是另一事務修改它之前的狀態(tài),要么是另一事務修改它之后的狀態(tài),事務不會查看到中間狀態(tài)的數(shù)據(jù)。打個比方,你買東西這個事情,是不影響其他人的。
  • D:持久性(Durability),指的是只要事務成功結(jié)束,它對數(shù)據(jù)庫所做的更新就必須***保存下來。即使發(fā)生系統(tǒng)崩潰,重新啟動數(shù)據(jù)庫系統(tǒng)后,數(shù)據(jù)庫還能恢復到事務成功結(jié)束時的狀態(tài)。打個比方,你買東西的時候需要記錄在賬本上,即使老板忘記了那也有據(jù)可查。

2、事務的傳播特性

事務傳播行為就是多個事務方法調(diào)用時,如何定義方法間事務的傳播。

Spring定義了7中傳播行為:

(1)propagation_requierd:如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是Spring默認的選擇。

(2)propagation_supports:支持當前事務,如果沒有當前事務,就以非事務方法執(zhí)行。

(3)propagation_mandatory:使用當前事務,如果沒有當前事務,就拋出異常。

(4)propagation_required_new:新建事務,如果當前存在事務,把當前事務掛起。

(5)propagation_not_supported:以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。

(6)propagation_never:以非事務方式執(zhí)行操作,如果當前事務存在則拋出異常。

(7)propagation_nested:如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行。如果當前沒有事務,則執(zhí)行與propagation_required類似的操作。

3、事務的隔離級別

(1)read uncommited:是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的數(shù)據(jù)。

(2)read commited:保證一個事物提交后才能被另外一個事務讀取。另外一個事務不能讀取該事物未提交的數(shù)據(jù)。

(3)repeatable read:這種事務隔離級別可以防止臟讀,不可重復讀。但是可能會出現(xiàn)幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的數(shù)據(jù)之外還避免了以下情況產(chǎn)生(不可重復讀)。

(4)serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理為順序執(zhí)行。除了防止臟讀,不可重復讀之外,還避免了幻象讀

 臟讀、不可重復讀、幻象讀概念說明:

 a. 臟讀:指當一個事務正字訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,而這種數(shù)據(jù)還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因為這個數(shù)據(jù)還沒有提交那么另外一個事務讀取到的這個數(shù)據(jù)我們稱之為臟數(shù)據(jù)。依據(jù)臟數(shù)據(jù)所做的操作肯能是不正確的。

 b. 不可重復讀:指在一個事務內(nèi),多次讀同一數(shù)據(jù)。在這個事務還沒有執(zhí)行結(jié)束,另外一個事務也訪問該同一數(shù)據(jù),那么在第一個事務中的兩次讀取數(shù)據(jù)之間,由于第二個事務的修改第一個事務兩次讀到的數(shù)據(jù)可能是不一樣的,這樣就發(fā)生了在一個事物內(nèi)兩次連續(xù)讀到的數(shù)據(jù)是不一樣的,這種情況被稱為是不可重復讀。

 c. 幻象讀:一個事務先后讀取一個范圍的記錄,但兩次讀取的紀錄數(shù)不同,我們稱之為幻象讀(兩次執(zhí)行同一條 select 語句會出現(xiàn)不同的結(jié)果,第二次讀會增加一數(shù)據(jù)行,并沒有說這兩次執(zhí)行是在同一個事務中)

4、事務幾種實現(xiàn)方式(兩種方式)

編程式事務管理(目前在開發(fā)中很少使用)

使用步驟

1. 配置數(shù)據(jù)庫事務管理 DataSourceTransactionManager

<!--配置事務管理器-->
<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2. 配置數(shù)據(jù)庫事務管理模板

<!--配置事務管理模板-->
<bean id="transactionTemplate"
      class="org.springframework.transaction.support.TransactionTemplate">
    <!--配置事務管理-->
    <property name="transactionManager" ref="transactionManager"></property>

</bean>

3. 在Service層中注入數(shù)據(jù)庫事務管理模板

 <!--配置Service-->
    <bean id="accountService" class="top.wintp.springtx.demo1.service.AccountServiceImpl">
        <!--配置事務的管理模板類-->
        <property name="transactionTemplate" ref="transactionTemplate"/>
        <property name="accountDao" ref="accountDao"/>
    </bean>

4. 在需要執(zhí)行事務的位置調(diào)用transactionTemplate的execute()方法

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

            //執(zhí)行你的邏輯
        }
});

聲明式事務管理

聲明式事務管理方式一:基于TransactionProxyFactoryBean的方式 (不常用)

使用步驟

1.配置事務管理 DataResourceTransactionManager

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2.配置事務代理類

<!--配置事務代理類-->
<bean id="accountServiceProxy"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!--配置事務管理器-->
    <property name="transactionManager" ref="transactionManager"/>

    <!--配置代理目標類-->
    <property name="target" ref="accountService"></property>

    <!--
        配置事物的基本屬性
        必須配置
    -->

    <property name="transactionAttributes">
        <props>

            <!--
            prop 格式
                key:方法名  或者 方法 *  例如  insert*
                值的格式:
                    PROPAGATION:事物的傳播行為
                    ISOLATION:事物的隔離級別
                    readOnly:只讀
                    -Exception:發(fā)生哪些異常,回滾事物 默認任何異常都回滾
                    +Exception:發(fā)生哪些異常,不回滾事物
            -->

            <prop key="transfMoney">PROPAGATION_REQUIRED</prop>

        </props>

    </property>
</bean>

3.引用代理類 使用代理目標類來接收

@Resource(name = "accountServiceProxy")
private AccountService mAccountService;

聲明式事務管理方式二:基于AspectJ的XML方式

1.配置事務管理類

<!--配置事務的管理類-->
 <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

2.配置事務的增強

  <!--配置事務的增強-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
 
    </tx:advice>

3.配置AOP – 切點和切面

<!--配置AOP-->
 <aop:config>
     <!--配置切入點-->
     <aop:pointcut id="pointcut1"
                   expression="execution(* top.wintp.springtx.demo6.service.AccountService+.*(..))"/>

     <!--配置切面-->
     <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>

 </aop:config>

聲明式事務管理方式三:基于注解的方式(常用)

1.配置事務管理器

<!--配置事務的管理類-->
<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2.開啟事務注解

<!--開啟事務注解
-->
<tx:annotation-driven transaction-manager="transactionManager"/>

3.在需要事物管理的類上添加注解

  @Transactional(propagation = Propagation.REQUIRED)

到此這篇關于Spring中的事務管理及實現(xiàn)方式解析的文章就介紹到這了,更多相關Spring事務管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹

    Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹

    這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下
    2015-04-04
  • Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例

    Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例

    這篇文章主要介紹了Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • logback ThrowableProxyConverter類源碼流程解析

    logback ThrowableProxyConverter類源碼流程解析

    這篇文章主要為大家介紹了logback ThrowableProxyConverter類源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java實現(xiàn)用戶短信驗證碼登錄功能實例代碼

    Java實現(xiàn)用戶短信驗證碼登錄功能實例代碼

    現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗證碼登錄功能設計與實現(xiàn),感興趣的可以了解一下
    2021-11-11
  • Java中如何對字符串進行utf-8編碼

    Java中如何對字符串進行utf-8編碼

    這篇文章主要介紹了Java中如何對字符串進行utf-8編碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot整合Hbase的實現(xiàn)示例

    SpringBoot整合Hbase的實現(xiàn)示例

    這篇文章主要介紹了SpringBoot整合Hbase的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Java中的CyclicBarrier循環(huán)柵欄深入解析

    Java中的CyclicBarrier循環(huán)柵欄深入解析

    這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄深入解析,CycleBarrier 它就相當于是一個柵欄,所有線程在到達柵欄后都需要等待其他線程,等所有線程都到達后,再一起通過,需要的朋友可以參考下
    2023-12-12
  • 簡單講解Java的Socket網(wǎng)絡編程的多播與廣播實現(xiàn)

    簡單講解Java的Socket網(wǎng)絡編程的多播與廣播實現(xiàn)

    這篇文章主要介紹了Java的Socket網(wǎng)絡編程的多播與廣播實現(xiàn),包括網(wǎng)絡編程發(fā)送和接受數(shù)據(jù)的一些基礎知識整理,需要的朋友可以參考下
    2016-01-01
  • Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例

    Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例

    這篇文章主要為大家介紹了Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Java實現(xiàn)一個達達租車系統(tǒng)的步驟詳解

    Java實現(xiàn)一個達達租車系統(tǒng)的步驟詳解

    這篇文章主要給大家介紹了利用Java實現(xiàn)一個達達租車系統(tǒng)的步驟,文中給出了詳細的實現(xiàn)思路和示例代碼,并在文末給出了完整的源碼供大家學習下載,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04

最新評論