欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1、事務(wù)認(rèn)識(shí)

大家所了解的事務(wù)Transaction,它是一些列嚴(yán)密操作動(dòng)作,要么都操作完成,要么都回滾撤銷。

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

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

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

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

2、事務(wù)的傳播特性

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

Spring定義了7中傳播行為:

(1)propagation_requierd:如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),如果已存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中,這是Spring默認(rèn)的選擇。

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

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

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

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

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

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

3、事務(wù)的隔離級(jí)別

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

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

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

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

 臟讀、不可重復(fù)讀、幻象讀概念說明:

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

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

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

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

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

使用步驟

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

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

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

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

</bean>

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

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

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

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

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

聲明式事務(wù)管理

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

使用步驟

1.配置事務(wù)管理 DataResourceTransactionManager

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

2.配置事務(wù)代理類

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

    <!--配置代理目標(biāo)類-->
    <property name="target" ref="accountService"></property>

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

    <property name="transactionAttributes">
        <props>

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

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

        </props>

    </property>
</bean>

3.引用代理類 使用代理目標(biāo)類來接收

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

聲明式事務(wù)管理方式二:基于AspectJ的XML方式

1.配置事務(wù)管理類

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

2.配置事務(wù)的增強(qiáng)

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

3.配置AOP – 切點(diǎn)和切面

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

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

 </aop:config>

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

1.配置事務(wù)管理器

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

2.開啟事務(wù)注解

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

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

  @Transactional(propagation = Propagation.REQUIRED)

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

相關(guān)文章

最新評(píng)論