熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring事務深入淺出

2013-11-23 20:17:24  來源: Java開源技術 
    一在Spring中配置事務管理器
   
    事務管理器bean的聲明
   
    ?<bean id=transactionManager
   
    class=orgspringframeworkormhibernateHibernateTransactionManager>
   
    ?   <property name=sessionFactory ref=sessionFactory />
   
    ?bean>
   
    如果你需要以標注驅動的方式管理的話必須在applicationContextxml中申明
   
    <tx:annotationdriven transactionmanager=transactionManager/>
   
    如果你用xml的方式使用事務管理器的話如下有一個例子
   
    ?<tx:advice id=txAdvice transactionmanager=transactionManager>
   
    ?    <tx:attributes>
   
    ?        <tx:method name=find* readonly=true/>
   
    ?        <tx:method name=* propagation=REQUIRED/>
   
    ?    tx:attributes>
   
    ?tx:advice>
   
    ??<aop:config>
   
    ?    <aop:pointcut expression=execution(* *daoimpl*()) id=daopc/>
   
    ?    <aop:pointcut expression=execution(* *serviceimpl*()) id=servicepc/>
   
    ?    <aop:advisor adviceref=txAdvice pointcutref=daopc/>
   
    ?    <aop:advisor adviceref=txAdvice pointcutref=servicepc/>
   
    ?aop:config>
   
    ?<aop:aspectjautoproxy />
   
    二在java代碼中指定事務屬性(使用標注)
   
    下面例子是Dao實現類的一個方法采用標注來指明事務
   
    ?@Transactional(readOnly=true)
   
    ?public List<User> findUser(UserDto dto) {
   
    ?    User user = new User()
   
    ?    pyProperties(dto user)
   
    ?    return factorygetCurrentSession()
   
    ?        createCriteria(Userclass)
   
    ?        add(Examplecreate(user))
   
    ?        list()
   
    ?}
   
    三Spring事務選項默認的 @Transactional設置如下
   
    · 事務傳播設置是 PROPAGATION_REQUIRED 使用現有事物沒有則啟動新事物
   
    · 事務隔離級別是 ISOLATION_DEFAULT
   
    · 事務是 讀/寫 false
   
    · 事務超時默認是依賴於事務系統的或者事務超時沒有被支持
   
    · 任何unchecked Exception將觸發事務回滾但是任何checked Exception將觸發事務提交
   
    @Transactional注解的屬性
   
    ·  傳播性propagation 可選的傳播性設置
   
    ·  隔離性isolation 可選的隔離性級別
   
    ·  只讀性readOnly 讀寫型事務 or 只讀型事務
   
    ·  回滾異常類rollbackFor 一組異常類遇到時必須進行回滾默認情況下checked exceptions不進行回滾而是提交僅unchecked exceptions才進行事務回滾
   
    ·  回滾異常類名rollbackForClassname 一組異常類名遇到時必須進行回滾
   
    ·  不回滾異常類noRollbackFor 一組異常類遇到時必須不回滾
   
    ·  不回滾異常類名noRollbackForClassname 一組異常類遇到時必須不回滾
   
    Propagation
   
    key屬性確定代理應該給哪個方法增加事務行為這樣的屬性最重要的部份是傳播行為有以下選項可供使用
   
    ·  PROPAGATION_REQUIRED支持當前事務如果當前沒有事務就新建一個事務這是最常見的選擇
   
    ·  PROPAGATION_SUPPORTS支持當前事務如果當前沒有事務就以非事務方式執行
   
    ·  PROPAGATION_MANDATORY支持當前事務如果當前沒有事務就拋出異常
   
    ·  PROPAGATION_REQUIRES_NEW新建事務如果當前存在事務把當前事務掛起
   
    ·  PROPAGATION_NOT_SUPPORTED以非事務方式執行操作如果當前存在事務就把當前事務掛起
   
    ·  PROPAGATION_NEVER以非事務方式執行如果當前存在事務則拋出異常
   
    Isolation Level(事務隔離等級)
   
    ·  Serializable:最嚴格的級別事務串行執行資源消耗最大
   
    ·  REPEATABLE READ:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據避免了髒讀取不可重復讀取的情況但是帶來了更多的性能損失
   
    ·  READ COMMITTED:大多數主流數據庫的默認事務等級保證了一個事務不會讀到另一個並行事務已修改但未提交的數據避免了髒讀取該級別適用於大多數系統
   
    ·  Read Uncommitted:保證了讀取過程中不會讀取到非法數據
   
    隔離級別在於處理多事務的並發問題我們知道並行可以提高數據庫的吞吐量和效率但是並不是所有的並發事務都可以並發運行這需要查看數據庫教材的可串行化條件判斷了
   
    我們首先說並發中可能發生的中不討人喜歡的事情
   
    ·  Dirty reads讀髒數據也就是說比如事務A的未提交(還依然緩存)的數據被事務B讀走如果事務A失敗回滾會導致事務B所讀取的的數據是錯誤的
   
    ·  nonrepeatable reads數據不可重復讀比如事務A中兩處讀取數據total的值在第一讀的時候total是然後事務B就把total的數據改成事務A再讀一次結果就發現total竟然就變成造成事務A數據混亂
   
    ·  phantom reads幻象讀數據這個和nonrepeatable reads相似也是同一個事務中多次讀不一致的問題但是nonrepeatable reads的不一致是因為他所要取的數據集被改變了(比如total的數據)但是phantom reads所要讀的數據的不一致卻不是他所要讀的數據集改變而是他的條件數據集改變比如Select accountid where accountname=ppgogo*第一次讀去了個符合條件的id第二次讀取的時候由於事務b把一個帳號的名字由dd改成ppgogo結果取出來了個數據
   
    readOnly
   
    事務屬性中的readOnly標志表示對應的事務應該被最優化為只讀事務這是一個最優化提示在一些情況下一些事務策略能夠起到顯著的最優化效果例如在使用Object/Relational映射工具(如Hibernate或TopLink)時避免dirty checking
   
    readOny只是一種暗示具體會不會起到優化的效果還取決於數據庫
   
    Timeout
   
    在事務屬性中還有定義timeout值的選項指定事務超時為幾秒在JTA中這將被簡單地傳遞到JEE服務器的事務協調程序並據此得到相應的解釋
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28239.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.