日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring配置文件详解三:Spring声明式事务管理

發布時間:2025/6/15 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring配置文件详解三:Spring声明式事务管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.聲明式事務管理

?Spring提供了聲明式事務管理,這是通過Spring AOP實現的。

原理:Spring中進行事務管理的通常方式是利用AOP(面向切片編程)的方式,為普通java類封裝事務控制,它是通過動態代理實現的,由于接口

是延遲實例化的,spring在這段時間內通過攔截器,加載事務切片。

2.Spring用BeanNameAutoProxyCreator自動創建事務代理

????? 采用這種配置策略,完全可以避免增量式配置,所有的事務代理由系統自動創建。容器中的目標bean自動消失,避免需要使用嵌套bean來保證

目標bean不可被訪問。這種配置方式依賴于Spring提供的bean后處理器,該后處理器用于為每個bean自動創建代理,此處的代理不僅可以是事務代

理,也可以是任意的代理,只需要有合適的攔截器即可。下面是這種代理在Spring配置文件中的配置方式:

<!-- 定義事務管理器 開啟Spring事務處理 -->
?<bean id="transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
???????????? <property name= "dataSource" ref= "dataSource" />
?</bean>

<!-- 定義事務傳播屬性 -->

<bean id= "nameMatch"class= "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
??? <property name= "properties" >
???????? <props>?????????????

???????????????<propkey="insert*">PROPAGATION_REQUIRED</prop>
????????????????
<propkey="find*">PROPAGATION_REQUIRED,readOnly</prop>
????????????????
<propkey="*">PROPAGATION_REQUIRED</prop>

????????? </props>
??? </property>
?</bean>

<!--?配置事務攔截器 -->
? <bean id="transactionInterceptor" class= "org.springframework.transaction.interceptor.TransactionInterceptor">

??????????<!--?? 事務攔截器bean需要依賴注入一個事務管理器 -->
???????????<property name= "transactionManager" >
??????????????????????? ?<ref local="transactionManager" />
????????? </property>

?????????? <!--?? 下面定義事務傳播屬性-->
????????? <property name="transactionAttributeSource">
???????????????????????? ?<ref local= "nameMatch" />
???????????</property>
?</bean>

<bean id= "autoProxyCreator" class= "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >

?????????? <!--指定對滿足哪些bean name的bean自動生成業務代理 -->
?????????? ?<property name= "beanNames" >
???????????????? <list>
??????????????????????? <value> *Service </value>
????????????????? </list>

??????????????????? <!--?? 此處可增加其他需要自動創建事務代理的bean-->
??????????? </property>

??????????? <!--?? 下面定義BeanNameAutoProxyCreator所需的事務攔截器-->
???????????? <property name= "interceptorNames" >
?????????????????? <list>
????????????????????? <idref local= "transactionInterceptor" />

????????????????????? <!-- 此處可增加其他新的Interceptor -->
????????????????? </list>
??????????? </property>
?</bean>

????? TranscationInterceptor是一個事務攔截器bean,需要傳入一個TransactionManager的引用。配置中使用 Spring依賴注入該屬性,

事務攔截器的事務屬性通過transactionAttributes來指定,該屬性有props子元素,配置文件中定義了 三個事務傳播規則:所有以insert開始的方法,

采用PROPAGATION_REQUIRED的事務傳播規則。程序拋出 MyException異常及其子異常時,自動回滾事務。

所有以find開頭的方法,采用PROPAGATION_REQUIRED事務傳播規則,并且只 讀。其他方法,則采用PROPAGATION_REQUIRED的事務傳播

規則。BeanNameAutoProxyCreator是個根據 bean名生成自動代理的代理創建器,該bean通常需要接受兩個參數。第一個是beanNames屬性,該

屬性用來設置哪些bean需要自動生成代理。 另一個屬性是interceptorNames,該屬性則指定事務攔截器,自動創建事務代理時,系統會根據這些事

務攔截器的屬性來生成對應的事務代理。

3.Spring事務管理配置屬性

?1.傳播行為(Propagation behavior):

?????? PROPAGATION_MANDATORY:方法必須在一個現存的事務中進行,否則丟出異常
?????? PROPAGATION_NESTED:在一個嵌入的事務中進行
?????? PROPAGATION_NEVER:不應在事務中進行,如果有則丟異常
?????? PROPAGATION_NOT_SUPPORTED:不應再事務中進行,如果有就暫停現存的事務
?????? PROPAGATION_REQUIRED:支持現在的事務,如果沒有就建立一個新的事務
?????? PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果現存一個事務就暫停它
?????? PROPAGATION_SUPPORTS:支持現在的事務,如果沒有就以非事務的方式執行

2.隔離層級(Isolation level):

?????? 在一個應用程序中,可能有多個事務在同時進行,這些事務應當彼此之間互不知道另一個事務的存在,比如現在整個應用程序就只有一個事務

存在,由于事務彼此之間獨立,若讀取的是同一個數據的話,就容易發生問題,比如:
?????? Dirty read(臟讀):某個事務已經更新了一份數據,另一份事務在此時讀取了同一份數據,由于某些原因,前一個事務回滾了,則后一個事務

讀取的數據則是錯誤的。
?????? Non-repeatable read(非重復讀):在一個事務的兩次查詢中事務不一致,可能是因為兩次查詢過程中間插入了一個事務更新的原有數據。
?????? Phantom read(幻象讀):在一個事務的兩次查詢中數據筆數不一致。
解決以上問題的方法之一,就是在某個事務進行過程中鎖定正在更新或查詢的數據,但是這樣會造成效率上的問題,別的事務必須等待當前事務解

鎖后才能 進行。然而,根據需求的不同,并不用在事務進行時完全的鎖定數據,隔離層級可以讓您根據實際的需求,對數據的鎖定進行設置。一下

是幾個隔離層級的參數說 明:
?????? ISOLATION_DEFAULT:使用底層數據庫預設的隔離層級
?????? ISOLATION_READ_COMMITTED:運行事務讀取其他事務已經提交的數據字段,可以防止臟讀問題
?????? ISOLATION_READ_UNCOMMITTED
:運行事務讀取其他并行事務還沒有提交的數據,會發生臟讀、非重復讀、幻象讀等問題
?????? ISOLATION_REPEATABLE_READ:要求多次讀取的數據必須相同,除非事務本身更新數據,可以防止臟讀、非重復讀等問題
?????? ISOLATION_SERIALIZABLE:完整的隔離層級,防止所有問題,會鎖定數據對應的表,有效率問題?
?????

????? 事實上,對于事務的傳播特性,可以設置對應的隔離層級。在Spring中,我們用的最多的就是PROPAGATIOIN_REQUIRED這種傳 播行為。這

個意思是,如果應用程序中已經存在一個事務了,當另一個事務進來時,會加入到這個事務中,如果沒有事務存在,則開啟一個新的事務。

總結

以上是生活随笔為你收集整理的Spring配置文件详解三:Spring声明式事务管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。