對spring 事物管理的理解

參考地址: http://blog.csdn.net/ufo2910628/article/details/46325651html

參考地址: http://www.jb51.net/article/70816.htmspring

參考地址: http://www.cnblogs.com/newsouls/p/3988216.html數據庫

參考地址: http://www.open-open.com/lib/view/open1414310646012.htmlexpress

 

springmvc層也就是 controller層儘可能不要寫太多代碼, 若是隻是對 數據庫的查詢,那麼能夠隨便寫代碼,寫在service層能夠,寫在controller層也能夠,可是推薦寫在 servi層寫代碼,contrller只是作簡單的額外處理和 轉發。mvc

可是若是整個mvc的過程設計到了 數據庫的 增刪改,那麼就必須將 代碼寫入service層裏面了,由於這樣是比較方便事物的管理的, 出現了異常的 數據的回滾。好比 事物的聲明式 註解:.net

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)設計

是應該只用在service層的,這是比較合理和常規的作法,在contrller層是 不能進行事物的管理。除非進行了配置htm

Spring事務類型詳解:blog

 

PROPAGATION_REQUIRED--支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。事務

PROPAGATION_SUPPORTS--支持當前事務,若是當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY--支持當前事務,若是當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW--新建事務,若是當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED--以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER--以非事務方式執行,若是當前存在事務,則拋出異常。

PROPAGATION_NESTED--若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則進行與PROPAGATION_REQUIRED相似的操做。

 

以上四種配置方式最經常使用的仍是第1、二種,第三種是比較老舊的方式,而註解的方式不太適合比較大的項目,用於簡單的小項目仍是很好的,其特色就是簡單明瞭。每種方法都有每種方法的特色跟適用的環境,沒有絕對的好與壞,只不過前兩種在實際的工做當中用的更多一些。

 

<!-- 第一種配置事務的方式 ,tx-->
<tx:advice id="txadvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />
        <tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception" />
        <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="*" propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/>
    <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/>
</aop:config>

expression="execution(* com.dao.*.*(..))" 其中第一個*表明返回值,第二*表明dao下子包,第三個*表明方法名,「(..)」表明方法參數。

相關文章
相關標籤/搜索