calmJava

          StillWaterRunsDeep
          隨筆 - 3, 文章 - 11, 評(píng)論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          spring_9

          1:
          異常類(lèi)型: checked 異常(例外) 和 unchecked異常(例外)
          checked 異常: 除運(yùn)行期異常外的其他異常方法 聲明為throw Exception 的異常,則Spring默認(rèn)不會(huì)回滾
          unchecked 異常: 即運(yùn)行期異常 RuntimeException Spring 默認(rèn)會(huì)回滾

          2:
          改變Spring的默認(rèn)事務(wù)行為:
          (1):使Spring回滾checked例外(默認(rèn)不會(huì)滾):
          在方法的聲明上標(biāo)注
          @Transactional(rollbackFor=異常的名稱.class)
          其中異常的名稱為方法拋出的異常(例外)的類(lèi)名稱
          則Spring在遇到此checked異常時(shí),就會(huì)回滾事務(wù)

          (2):使Spring不回滾unchecked 例外(默認(rèn)回滾)
          在方法的聲明上標(biāo)注
          @Transactional(noRollbackFor=RuntimeException.class)
          則在方法遇到unchecked例外(運(yùn)行期異常)時(shí),則會(huì)提交事務(wù)
          或者使用 noRollbackForClassName="異常的名稱" 和 rollbackForClassName="異常的名稱" 來(lái)指定

          3:
          以下的事務(wù)可以在 @Transactional(propagation=Propagation.xxx) 中的xxx即為以下事務(wù)的類(lèi)型.
          Spring事務(wù)的分類(lèi):
          REQUIRED,NOT_SUPPORTED,REQUIRESNEW,MANDATORY,SUPPORTS,NERVER,NESTED
          REQUIRED:
          業(yè)務(wù)方法需要在一個(gè)事務(wù)中運(yùn)行.如果方法運(yùn)行時(shí),已經(jīng)處在一個(gè)事務(wù)中,那么假如到該事務(wù),否則為自己創(chuàng)建一個(gè)新的事務(wù).
          NOT_SUPPORTED:
          聲明方法不需要事務(wù).如果方法沒(méi)有關(guān)聯(lián)到一個(gè)事務(wù),容器不會(huì)為它開(kāi)啟事務(wù).如果方法在一個(gè)事務(wù)中被調(diào)用,該事務(wù)會(huì)被掛起,在方法調(diào)用結(jié)束后,原先的事務(wù)便會(huì)恢復(fù)執(zhí)行.
          REQUIRESNEW:
          屬性表明不管是否存在事務(wù),業(yè)務(wù)方法總會(huì)為自己發(fā)起一個(gè)新的事務(wù),容器不會(huì)為它開(kāi)啟事務(wù).
          如果方法已經(jīng)存在一個(gè)事務(wù)中,則原有事務(wù)被掛起,新的事務(wù)會(huì)被創(chuàng)建,直到方法執(zhí)行結(jié)束,新的事務(wù)才算結(jié)束.原先事務(wù)才會(huì)恢復(fù)執(zhí)行.
          MANDATORY:
          該屬性指定業(yè)務(wù)方法只能在一個(gè)已近存在的事務(wù)中執(zhí)行,業(yè)務(wù)方法不能發(fā)起自己的事務(wù).如果業(yè)務(wù)方法沒(méi)有在事務(wù)的環(huán)境下調(diào)用,容器就會(huì)拋出例外.
          SUPPORTS:
          這一事務(wù)表明屬性,如果業(yè)務(wù)方法在某個(gè)事務(wù)范圍內(nèi)被調(diào)用,則方法稱為該事務(wù)的一部分.如果業(yè)務(wù)方法在事務(wù)范圍外被調(diào)用,則方法在沒(méi)有事務(wù)的環(huán)境下執(zhí)行.
          NEVER:
          指定業(yè)務(wù)方法絕對(duì)不能再事務(wù)范圍內(nèi)執(zhí)行.如果業(yè)務(wù)方法在某個(gè)事務(wù)中執(zhí)行,容器會(huì)拋出異常,只有業(yè)務(wù)方法沒(méi)有關(guān)聯(lián)到任何事務(wù),才能正常執(zhí)行.
          NESTED:
          如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行一個(gè)嵌套的事務(wù)中.如果沒(méi)有活動(dòng)事務(wù),則按REQUIRED屬性執(zhí)行.它使用了一個(gè)單獨(dú)的事務(wù),這個(gè)事務(wù)擁有多個(gè)可以回滾的保存點(diǎn)。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響。但外部事務(wù)的回滾會(huì)造成內(nèi)部事務(wù)的回滾. 它只對(duì)DataSourceTransactionManager事務(wù)管理器起效.

          4:
          @Transactional(timeout=30)
          中指定事務(wù)的超時(shí)時(shí)間,一般情況下不用設(shè)置

          5:
          @Transactional(readOnly="")
          在只讀事務(wù)中使用,可以提高效率,但不可以執(zhí)行增刪改.

          6:
          @Transactional(isolation=Isolation.DEFAULT);
          指定數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別:主要由底層數(shù)據(jù)庫(kù)實(shí)現(xiàn).
          包括種類(lèi):
          Read Uncommited : 讀未提交數(shù)據(jù)(會(huì)出現(xiàn)臟數(shù)據(jù),不可重復(fù)讀和幻讀)
          Read Commited : 讀已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀) (SQLServer 默認(rèn)級(jí)別)
          Repeatable Read : 可重復(fù)讀(會(huì)出現(xiàn)幻讀) (MySQL 默認(rèn)級(jí)別)(一般情況下是這種級(jí)別)
          Serializable : 串行化
          這幾種級(jí)別是由數(shù)據(jù)庫(kù)的不同的鎖來(lái)實(shí)現(xiàn):如 共享鎖,更新鎖,排他鎖

          臟讀: 一個(gè)事務(wù)讀取到另一個(gè)事務(wù)未提交的更新數(shù)據(jù).

          不可重復(fù)讀: 在同一個(gè)事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同.即:后續(xù)讀取可以讀取另一事物已提交的更新數(shù)據(jù).
          相反,"可重復(fù)讀"在同一事務(wù)多次讀取數(shù)據(jù)時(shí),能夠保證所讀取數(shù)據(jù)一樣,也就是說(shuō),后續(xù)數(shù)據(jù)不能讀到另一事物已提交的更新數(shù)據(jù).
          可重復(fù)讀在數(shù)據(jù)庫(kù)采取的技術(shù)為"快造"技術(shù)

          幻讀:一個(gè)事物讀取都另一事物已提交的insert數(shù)據(jù).


          7:
          使用XML方式配置Spring事務(wù):
          <aop:config>
           <aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))"/>
           <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
          </aop:config>
          <tx:advice id="txAdvice" transaction-manager="txManager">
           <tx:attributes>
            <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/> <!-- 對(duì)讀取方法采用只讀 事務(wù) -->
            <tx:method name="*"/> <!-- 其他按照默認(rèn)設(shè)置 如事務(wù)隔離級(jí)別 事務(wù)類(lèi)型 -->
           </tx:attributes>
          </tx:advice>

           

           

           

           

           

           

           

           

           

          posted on 2011-01-05 21:01 calmJava 閱讀(404) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 临武县| 灵璧县| 阳原县| 南陵县| 永嘉县| 龙井市| 舟曲县| 德安县| 宁乡县| 纳雍县| 兰坪| 酉阳| 河北省| 翼城县| 太谷县| 大安市| 兰溪市| 盖州市| 孟津县| 上栗县| 阿坝| 巴塘县| 浏阳市| 侯马市| 阿瓦提县| 革吉县| 广水市| 军事| 铜梁县| 清徐县| 潢川县| 甘谷县| 浦江县| 万盛区| 定西市| 六安市| 乐陵市| 礼泉县| 武山县| 扎赉特旗| 孙吴县|