Spring配置中transactionAttributes的意義


 

最近使用JSF+Spring+OpenJPA框架開發,但是在使用spring提供的JpaTemplate進行查詢時,如果數據量超過100 條,查詢效率就會明顯降低。由於開始時使用JPA內部的雙向關聯,造成各實體內部關聯過多,從而影響所有的操作,因此懷疑是因爲JPA的關聯關係所致。但 是去掉關聯關係後的效果不顯著。

查找spring的相關配置,發現原來關於“transactionAttributes”有問題。原來的配置如下:

〈bean id=“baseTxProxy” lazy-init=“true”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean” scope=“singleton” abstract=“true”〉
  〈property name=“transactionManager”〉
   〈ref local=“transactionManager” /〉
  〈/property〉
  〈property name=“transactionAttributes”〉
   〈props〉
    〈prop key=“register*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“trade*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“cancel*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“save*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“exe*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“add*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“persist*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“remove*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“del*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“update*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“gen*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“finish*”〉PROPAGATION_REQUIRED〈/prop〉
    〈prop key=“get*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
    〈prop key=“find*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
    〈prop key=“query*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
    〈prop key=“select*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
    〈prop key=“is*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
   〈/props〉
  〈/property〉
 〈/bean〉

使用上述配置,在JPA打出的日誌中顯示每次查詢時都要進行更新操作,查閱相關spring 的資料後發現transactionAttributes的各種屬性的意義如下:

PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED--如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。

當 前所有的事務都使用“PROPAGATION_REQUIRED”屬性值,並且控制事務的操作權限爲只讀,以保證查詢時不會更新數據。根據上述定義 “PROPAGATION_REQUIRED”屬性會造成爲所有的操作都創建事務,從而會出現JPA的日誌中查詢時也會進行更新操作的現象,也就造成了效 率的低下。將所有查詢的操作改成事務類型爲“PROPAGATION_NEVER”(不使用事務),則查詢效率立即提升,但是此時擔心一個問題:比如在一 個saveXXX()的方法中,如果方法內部使用更新、查詢、再更新的操作流程,會不會造成調用查詢時,由於上述配置造成的拋出異常。

另外,如果出現









prop key="myMethod"



PROPAGATION_REQUIRED,readOnly,-Exception







/prop



這樣的配置,其中:

-Exception表示有Exception拋出時,事務回滾. -代表回滾+就代表提交

readonly 就是read only, 設置操作權限爲只讀,一般用於查詢的方法,優化作用.

發佈了45 篇原創文章 · 獲贊 24 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章